jq:複数の配列の複数の値を一度に印刷する

jq:複数の配列の複数の値を一度に印刷する

の基本的な機能は、jq配列内の各オブジェクトを一度に1つずつ送信することです。ただし、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つのコマンドですべての値をまとめて収集する方法はありますか?

答え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これは順番に配列の1つなので、試行すると各最上位キーの接続文字列が生成されますlist1。最後のパイプシンボルまですべてを で囲み、 に[ ... ]展開して結合する単一の配列を作成する場合、アプローチが機能します。上記の最初のアプローチで行ったことは、その配列の要素を生成するために少し短い式を使用することです。.list.list[]

$ jq -r '[ to_entries[] |  { list: .value.list1 } | .list[] ] | join(" ")' file
val1 val2 val3 val4 val5 val6

関連情報