解析したいJSONファイルがあります。フィールド値がある場合は、キー値を選択したいと思いますauto
。シェルからJSONを解析するためにpackage2
使用されます。jq
bash
{
"package1":{
"name":"package_1",
"value":"manual"
},
"package2":{
"name":"package_2",
"value":"auto"
}
}
答え1
そして
jq 'map_values(select(.value == "auto"))' file
...関心のあるトップレベルオブジェクトの一部を抽出します。
{
"package2": {
"name": "package_2",
"value": "auto"
}
}
を使用すると、入力オブジェクトのすべてのサブ部分map_values(expression)
に適用できます。expression
この場合、その部分は予約する文のテストがselect()
次のように評価される場合本物、そうでなければ廃棄します。似ていますmap(expression)
が、map()
配列やmap_values()
オブジェクトに使用できます。
ここから最上位キーを取得することを選択できます。
$ jq -r 'map_values(select(.value == "auto"))|keys[]' file
package2
このkeys
関数は入力オブジェクトのすべてのキー配列を生成し、最後に[]
配列を文字列セットに展開します。
auto
キー値に複数の子オブジェクトがある場合、このコマンドは複数の文字.value
列を取得します。
.name
しばらくの間、キー値が必要なのか最上位キーが必要なのかわかりません。私はあなたが最上位のキーだけが欲しいと思ったときに以下のテキストを書いた。これはコメントとして残します。
$ jq -r 'map_values(select(.value == "auto"))[].name' file
package_2
最後の使用では、[].name
最上位オブジェクトを子オブジェクトのセットに展開し、各子オブジェクト.name
からキー値を抽出します。
最後は次のように書くこともできます。
$ jq -r 'map_values(select(.value == "auto").name)[]' file
package_2
...元のオブジェクトを次のように減らします。
{
"package2": "package_2"
}
...その後、次のキーとともに残りのすべてのキーの値を抽出します[]
。