의 기본 기능은 jq
배열의 각 객체를 한 번에 하나씩 보내는 것입니다. 단, join
연산자는 값을 결합할 수 있습니다. 내 문제는 여러 배열의 모든 값을 한 번에 인쇄하려고 하는 것입니다. 다음 예를 들어보세요.
{
"key1": {
"list1": [
"val1",
"val2",
"val3"
]
},
"key2": {
"list1": [
"val4",
"val5"
]
},
"key3": {
"list1": [
"val6"
]
}
}
인쇄하고 싶습니다:
val1 val2 val3 val4 val5 val6
지금까지:
jq -r 'to_entries[] | { list: .value.list1 } | .list | join(" ")' test.json
(리뷰어를 돕기에는 너무 길다.)
이것은 만든다:
val1 val2 val3
val4 val5
val6
하나의 명령으로 모든 값을 함께 수집하는 방법이 있습니까?
답변1
$ jq -r '[ .[].list1[] ] | join(" ")' file
val1 val2 val3 val4 val5 val6
list1
각 최상위 키에 있는 각 배열의 모든 요소를 사용하여 새 배열을 만듭니다. 그런 다음 해당 요소를 공백으로 연결합니다. 그러면 입력 파일에 나타나는 순서대로 값이 제공됩니다.
또 다른 (아마도 더 깔끔한) 접근 방식은 map(.list1)
배열의 배열을 반환하는 것인데, 이를 병합하고 연결할 수 있습니다.
$ jq -r 'map(.list1) | flatten | join(" ")' file
val1 val2 val3 val4 val5 val6
.list
이는 차례로 배열 중 하나이므로 시도하면 각 최상위 키에 대한 연결 문자열이 생성됩니다 list1
. 마지막 파이프 기호까지 모든 것을 로 묶고 로 [ ... ]
확장하여 결합되는 단일 배열을 생성하는 경우 접근 방식이 작동합니다 . 위의 첫 번째 접근 방식에서 수행한 작업은 해당 배열의 요소를 생성하기 위해 약간 더 짧은 표현식을 사용한 것입니다..list
.list[]
$ jq -r '[ to_entries[] | { list: .value.list1 } | .list[] ] | join(" ")' file
val1 val2 val3 val4 val5 val6