jqを使用して値が0であることを確認し、呼び出しシェルスクリプトに0を返します。

jqを使用して値が0であることを確認し、呼び出しシェルスクリプトに0を返します。

このJSONファイルがあります。

{「キー11」:1010、「キー12」:12120、「キー13」:12103}

jqa の対応する値がkey[0-9][0-9]0 であるかどうかを確認するには、jqそうであれば正常に終了し、それ以外の場合は終了しますか?

前の質問からこのスクリプトを入手しました。

#!/bin/bash
json=$(cat <<EOF
{"key11":12120,"key11_":13,"key11_yes":12107,
"key12":13492,"key12_no":9,"key12_yes":13483,
"key13":10200,"key13_no":9,"key13_yes":10191,
"key21":16756,"key21_no":30,"key21_yes":16726,
"key22":17057,"key22_no":34,"key22_yes":17023,
"key23":16798,"key23_no":25,"key23_yes":16773,
"key31":2733,"key31_yes":2733,
"key32":2561,"key32_yes":2561,
"key33":2570,"key33_yes":2570}
EOF
)
json2=$(echo ${json}|jq 'with_entries(if (.key|test("key[0-9][0-9]$")) then ( {key: .key, value: .value } ) else empty end )')

結果:

{ "key11": 12120, "key12": 13492, "key13": 10200, "key21": 16756, "key22": 17057, "key23": 16798, "key31": 2733, "key32": 2561, "key33": 2570 }

今、すべてのキーに添付されている値を確認したいと思います$json2どの項目の戻り値は0です0

答え1

any項目のいずれかが true の場合は true を返す組み込みフィルタです。、そうでなければ偽です。--exit-status/終了の-e原因jq0iffの最終出力はfalseでもnullでもありません。

スクリプトに示されているように、目的のキーのみを含めるように文書をフィルタリングした場合は、次のことができます。

previous_command | jq -e 'any( .[] ; . == 0 )'

.[]すべての値を取得し、anyそのうち0が見つかった場合にのみtrueを出力します。または最も明確であると思われるものを選択してください[.[]|.==0]|anymap(.==0) | any


一度にすべての操作を実行して、無駄なプロセスを減らすこともできますjq

jq -e '[to_entries | .[] | select(.key | test("key[0-9][0-9]$")) | .value == 0 ] | any' data.json

これは、一致するすべてのキーを選択し、各値が0であることを確認し、結果のコレクションをパイプし、0が存在する場合はany0で終了します。 NaNがないと確信している場合は、NaNを乗算することもできます。reduce

関連情報