次のJQコマンドを使用して、JSONを除外します。私の要件は、予想されるノードが存在する場合にJSONメッセージを除外することです。または、何もしません。したがって、if、Elif、...を使用します。
sed -n "s/.*Service - //p" $1/response.log* |
jq "if (.requests | length) != 0 then .requests |= map(select(.id == \"123\"))
Elif (.result | length ) != 0 then .result |= map(select(.id== \"123\"))
else " " end" > ~/result.log
ここでは他に必須のようです。 elseブロック内では何もしたくありません。とにかく、私は他を無視するか、他の内部にいくつかのホワイトスペスを印刷することができます。
上記の場合、結果ファイルに二重引用符 ""を出力します。
あなたはイディオムを使いたいかもしれません:
if CONDITION then WHATEVER else empty end
empty
は、何も出力しないフィルターです。nullでさえありませんが、これは結局のところ(つまりJSON値)です。ブラックホールに少し似ていますが、ブラックだけです-提供されたものは何でも消費しますが、ブラックホールとは異なり、ホーキング放射さえも放出しません。
あなたの場合、 "Elif"があるので、 "else empty"を使用するのがおそらくあなたが望むものですが、参考のために、上記はまったく同じです:
select(CONDITION) | WHATEVER
追伸私の推測では、sedコマンドの目標が何であれ、jqプログラムの一部として、おそらくwalk/1
。
Jq 1.6のリリース後、「if elseがなければif」のセマンティクスが「if _ then _ else。end」、つまり次のように変更されました。
if P then Q end
=== if P then Q else . end
オブジェクトにこれ以上変更を加えないので、「アイデンティティ」フィルターを使用してください.
。
if (.requests | length) then ... else . end
一方、requests
を使用して空でない場合は、result
またはmap
プロパティを更新するだけです。チェックは必要ありません。空の場合、空を返します。
フィルターを次のように単純化できます。
.requests |= map(select(.id == \"123\")) | .result |= map(select(.id== \"123\"))