jqを使用して、json配列から部分的に一致するクエリを含む配列を取得します。

jqを使用して、json配列から部分的に一致するクエリを含む配列を取得します。

["a", "b", "c"], ["abc", "e", "f"]次のjsonデータと「a」が部分的に一致するクエリで与えられた場合、jqを使用して部分的に一致するクエリ「a」を含む配列をどのように取得できますか?

[
    ["a", "b", "c"],
    ["abc", "e", "f"],
    ["g", "h", "i"]
]

jq '. [] | select(index("a"))'正確に一致するものだけをインポートしますが、["a", "b", "c"]「abc」に「a」が含まれているのでインポートしたいと思います。["abc", "e", "f"]

答え1

以下とは少し異なるアプローチ漕ぐ船は何を持っていったの?:

jq 'map(select(any(contains("a"))))' file

最も内側のテストは各文字列の部分文字列をテストしますa。サブ配列の文字列にが含まれている場合は、aそのサブ配列が選択されます。map最上位配列のすべてのサブ配列に選択を適用します。

結果は、1つ以上の部分文字列を含む要素を含むサブ配列の最上位配列ですa

[
  [
    "a",
    "b",
    "c"
  ],
  [
    "abc",
    "e",
    "f"
  ]
]

答え2

jq '[.[] | select(contains(["a"]))]'

入力配列を使用します。

$ jq -c << \\ '[.[] | select(contains(["a"]))]'
[
    ["a", "b", "c"],
    ["abc", "e", "f"],
    ["g", "h", "i"]
]
\
[["a","b","c"],["abc","e","f"]]

man jqhttps://stedolan.github.io/jq/manual/)少し長いが、関連部分は以下の通りである。

contains(b)b が入力に完全に含まれる場合、フィルタは true を生成します。 B が A の部分文字列の場合、文字列 B は文字列 A に含まれます。 Bのすべての要素がAの要素に含まれる場合、配列Bは配列Aに含まれます。

jq 'contains(["baz", "bar"])'
タイプ["foobar","foobaz","blarp"]
確かに出力

関連情報