の基本的な機能は、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