次のような行を含むファイルがあります。
{"items":["blue","green"]}
{"items":["yellow","green"]}
{"items":["blue","pink"]}
jqを使用して、"items" 配列に "blue" を持つ JSON 値のみを選択して表示するにはどうすればよいですか?
したがって、出力は次のようになります。
{"items":["blue","green"]}
{"items":["blue","pink"]}
答えがわかった
jq 'select(.items | index("blue"))'
あなたが持っているものは確かに機能しますが、を使用する方がより正しいでしょうcontains
。混乱を招く可能性があるため、その使用は避けます。 index("blue")
で0
あり、それを真の値とは見なさず、結果から除外されることを期待するかもしれません。
代わりに、次のフィルターを使用することを検討してください。
select(.items | contains(["blue"]))
これには、配列に追加するだけで、複数の一致するアイテムが必要な場合に機能するという追加の利点があります。
ウィルがコメントで指摘したように、これは完全に正しくありません。contains
ここでは、部分文字列の一致 (が再帰的に使用されます)を使用して文字列が比較されます。
振り返ってみると、contains
思ったほどうまくいきませんでした。使っindex
てもいいけど、個人的には使いたくない。アイテムがコレクションに含まれているかどうかを調べるには、そのインデックスを探すのがおかしいと思います。を使用contains
する方が理にかなっていますが、この情報に照らして考えると、この場合は理想的ではありません。
正しく機能するはずの代替手段を次に示します。
select([.items[] == "blue"] | any)
または、より多くの値を一致させたい場合は、よりスケーラブルな方法を使用します。
select(.items as $values | ["blue", "yellow"] | map([$values[] == .] | any) | all)