これは非常に基本的な(おそらくばかげた)質問ですが、機能させることができません...
次の構造のJSONファイルがあります。
{
"data": {
"what a burger": [1,2,3],
"wap": [66],
"the map": [11,20],
"H. Incandenza": [1,1],
"What a burger": [a,a,3]
}
}
「名前」が特定のパターンに一致するdata内のフィールドの値を抽出したいと思います。たとえば、「what burger」の大文字と小文字を区別しないすべての一致を抽出して、
[1,2,3],[a,a,3]
私の推測は次のようなものでしょう
jq '.data | match("what a burger";"i")'
しかし、これは
jq: error (at <stdin>:9): object ({"what a bu...) cannot be matched, as it is not a string
乾杯。
データオブジェクトをmatchにフィードしようとするため、ステートメントは機能しませんが、matchは文字列でのみ機能します。
次の式はあなたが望むことをします。 to_entries
は、オブジェクトをキーと値の配列に変換します。次に、map
およびselect
を使用してこの配列を反復処理し、.key
(現在は文字列)にはmatch
があります。最後に、すべての要素の値を出力します。
.data | to_entries | map(select(.key | match("what a burger";"i"))) | map(.value)
ただし、2つのコメント:
[a,a,3]
はJSONでは許可されていません。a
は数値ではないためです。jq
は要素を1つだけ出力します。少し簡単な代替案を次に示します。
.data | with_entries(select(.key|match("what a burger";"i")))[]
入力を修正し、jqの-cオプションを使用すると、次の2つの行が生成されます。
[1,2,3]
["a","a",3]