else in jqが期待した出力を提供しない場合

else in jqが期待した出力を提供しない場合

ユーザーのフィールドが内部フィールドの場合は、そのフィールドを表示する必要があります。

入力する:

[
  {
    "name": "A_A",
    "uri": "https:test/test",
    "realm": "internal"
  },
  {
    "name": "B_B",
    "uri": "https:test/test",
    "realm": "internal"
  },
  {
    "name": "C_C",
    "uri": "https:test/test",
    "realm": "external"
  }
]

試験を終えた:

jq 'if .[].realm == "internal" then .[].name else empty end'

しかし、問題はすべてのユーザーを一覧表示することです。

予想出力:

A_A , B_B

答え1

jq関数を使用できますselect

<file jq -r '.[] | select(.realm == "internal") | .name'

最初は.[]配列要素を取得します。select()正しい要素を含む個々の要素とフィルタに適用されますrealm。最後の部分はnameフィールドを印刷します。

答え2

条件を歩かなければならない後ろにテストする単一のプロジェクトを繰り返します。

jq '.[]| (if .realm == "internal" then .name else empty end)'

答え3

@csvユーザーがCSV形式の出力を望むようですjq

このコマンドは、入力配列の各要素にステートメントをmap()適用するためにも使用されます。select()

$ jq -r 'map(select(.realm == "internal").name)|@csv' file
"A_A","B_B"

これは、キー値に基づいて関連する配列エントリを選択し、ここからキー値を抽出してrealm問題を解決したことを示しています。これにより、単一のCSVレコードとしてフォーマットされ、出力される値のname配列が残ります。name@csv

関連情報