web-dev-qa-db-ja.com

jqで要素が配列に存在するかどうかを確認する方法

配列があり、その配列に要素が存在するかどうかを確認するか、jq、fruit.jsonを使用して配列からその要素を取得する必要があります。

{
    "fruit": [
        "Apple", 
        "orange",
        "pomegranate",
        "apricot",
        "mango"
    ]
}


cat fruit.json | jq '.fruit .Apple' 

動作しません

14
idmitriev

「含む」のセマンティクスはまったく簡単ではありません。一般的に、配列に特定の値があるかどうかをテストするには、「インデックス」を使用する方が良いでしょう。

.fruit | index( "orange" )

1で

JqにIN/1がある場合、より良い解決策はそれを使用することです:

.fruit as $f | "orange" | IN($f[])

Jqにfirst/1がある場合(jq 1.5と同様)、使用するIN/1の高速定義は次のとおりです。

def IN(s): first((s == .) // empty) // false;
26
peak

[警告:コメントと代替案をご覧ください。]

cat fruit.json | jq '.fruit | contains(["orange"])'
2
zinovii

配列jq"Apple"を含む場合にfruitが成功を返し、そうでない場合はエラーを返します。

jq -e '.fruit[]|select(. == "Apple")' fruit.json >/dev/null

見つかった要素を出力するには、>/dev/nullを省略します。

2
markusk

将来の訪問者のために、たまたま変数に配列があり、それに対してinputをチェックする必要があり、jq 1.5(INなし)がある場合、最良のオプションはindexです。ただし、2番目の変数を使用します。

.inputField as $inputValue | $storedArray|index($inputValue)

これは機能的に.inputField | IN($storedArray[])と同等です。

1
aaa

jq以外の何かを使用することにオープンである場合、 Xidel を強くお勧めします。
これを使用すると、JSONiqとXPath/XQueryを組み合わせてJSONを処理できます。

単にブール値を返すようにするには:

$ xidel -s fruit.json -e '$json/contains((fruit)(),"Apple")'
true

配列fruitに「Apple」が含まれている場合に要素を返すようにするには:

$ xidel -s fruit.json -e '$json/(fruit)()[contains(.,"Apple")]'
Apple

上記は「XPath表記」です。 「ドット表記」(jqなど):

$ xidel -s fruit.json -e '($json).fruit()[contains(.,"Apple")]'
Apple
1
Reino