web-dev-qa-db-ja.com

jqを使用したフィールド名のパターンマッチング

これは非常に基本的な(おそらくばかげた)質問ですが、機能させることができません...

次の構造の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

乾杯。

12
manu

データオブジェクトを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は数値ではないためです。
  • 大文字と小文字のみが等しくなくても、キーが実際には異なるため、この方法は機能します。少なくとも2つのキーが同一の場合、キーは一意でなければならないため、問題が発生します。実際、jqは要素を1つだけ出力します。
7
koalo

少し簡単な代替案を次に示します。

.data | with_entries(select(.key|match("what a burger";"i")))[]

入力を修正し、jqの-cオプションを使用すると、次の2つの行が生成されます。

[1,2,3]
["a","a",3]
8
peak