フィールド値が「auto」の場合は、キーを選択してください。

フィールド値が「auto」の場合は、キーを選択してください。

解析したいJSONファイルがあります。フィールド値がある場合は、キー値を選択したいと思いますauto。シェルからJSONを解析するためにpackage2使用されます。jqbash

{
    "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"
}

...その後、次のキーとともに残りのすべてのキーの値を抽出します[]

おすすめ記事