jqを使用してホワイトリスト/ブロックリストに基づいて選択する方法

jqを使用してホワイトリスト/ブロックリストに基づいて選択する方法

を使用して、jqいくつかのホワイトリスト/ブロックリスト内の各要素キーの包含/除外に基づいて、配列からjson要素をどのように選択できますか?

大文字と小文字を区別しないインクルードを作成したい(したがって、ホワイトリスト/ブロックリストの大文字と小文字は重要ではありません)。

私が試した方法は次のとおりです(ブロックリストは実装されていません)。

allowlist='["happy", "good"]'
blocklist='["sad", "bad"]'

jq  --argjson allowlist "$allowlist" \
    --argjson blocklist "$blocklist" \
    '.[]
    | select(.my_key | ascii_downcase
    | contains($allowlist[]))' \
<<< '[{"my_key": "neutral"}, {"my_key": "neutral good"},
     {"my_key": "neutral bad"}, {"my_key": "good"}, 
     {"my_key": "bad"}, {"my_key": "happy sad bad"}, 
     {"my_key": "neutral happy sad"}]'

予想出力:

{"my_key": "neutral good"}
{"my_key": "good"}

答え1

selectanyおよびを使用すると、allフィルタは次のように要約されます。

jq  --argjson allowlist "$allowlist" \
    --argjson blocklist "$blocklist" '.[] | 
        select( any ( .my_key ; contains( $allowlist[] ) ) ) | 
        select( all ( .my_key ; contains( $blocklist[] ) | not ) )'

すべて小文字が必要な場合は、上記のascii_downcaseフィルタに値を追加してください。my_keycontains

関連情報