web-dev-qa-db-ja.com

他にない場合のJSON JQ

次の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ブロック内では何もしたくありません。とにかく、私は他を無視するか、他の内部にいくつかのホワイトスペスを印刷することができます。

上記の場合、結果ファイルに二重引用符 ""を出力します。

19
user1578872

あなたはイディオムを使いたいかもしれません:

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

34
peak

オブジェクトにこれ以上変更を加えないので、「アイデンティティ」フィルターを使用してください.

if (.requests | length) then ... else . end

一方、requestsを使用して空でない場合は、resultまたはmapプロパティを更新するだけです。チェックは必要ありません。空の場合、空を返します。

フィルターを次のように単純化できます。

.requests |= map(select(.id == \"123\")) | .result |= map(select(.id== \"123\"))
3
Jeff Mercado