jq: 여러 배열의 여러 값을 한 번에 인쇄

jq: 여러 배열의 여러 값을 한 번에 인쇄

의 기본 기능은 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

관련 정보