jq - 1行に値を印刷します。

jq - 1行に値を印刷します。

JSON入力:

[
  {
    "name": "cust1",
    "grp": [
      {
        "id": "46",
        "name": "BA2"
      },
      {
        "id": "36",
        "name": "GA1"
      },
      {
        "id": "47",
        "name": "NA1"
      },
      {
        "id": "37",
        "name": "TR3"
      },
      {
        "id": "38",
        "name": "TS1"
      }
    ]
  }
]

予想される出力は2行です。

name: cust1
groups: BA2 GA1 NA1 TR3 TS1

フィルタを構築しようとしましたが、成功しませんでした。

$ jq -r '.[]|"name:", .name, "groups:", (.grp[]|[.name]|@tsv)' test_json
name:
cust1
groups:
BA2
GA1
NA1
TR3
TS1

更新:以下の解決策は正しく機能しますが、グループが存在しないときに何が起こるかを予測することはできません。

[
  {
    "name": "cust1",
    "grp": null
  }
]

この場合、提供された解決策はエラーを返します。

$ jq -jr '.[]|"name:", " ",.name, "\n","groups:", (.grp[]|" ",.name),"\n"' test_json2
name: cust1
jq: error (at test_json2:6): Cannot iterate over null (null)

どんな解決策でも感謝します。

答え1

「登録」を使用してください。-j

$ jq -jr '.[]|"name:", " ",.name, "\n","groups:", (.grp[]|" ",.name),"\n"' test_json
name: cust1
groups: BA2 GA1 NA1 TR3 TS1

プレースホルダーを含める

$ jq -jr '.[]|"name:", " ",.name, "\n","groups:", (.grp//[{"name":"-"}]|.[]|" ",.name),"\n"' test_json
name: cust1
groups: -

答え2

$ jq -r '.[] |
      [ "name:", .name ], [ "groups:", .grp[].name ]
      | @tsv' file.json
name:   cust1
groups: BA2     GA1     NA1     TR3     TS1

つまり、@tsv2つの配列が与えられ、1つは名前を含み、もう1つはグループを含みます。各配列は独自の行になります。

grp配列が空になり、1つを挿入したい場合-

$ jq -r '.[] |
      [ "name:", .name ], [ "groups:", (.grp // [])[].name // "-" ]
      | @tsv' file.json
name:   cust1
groups: -

演算は OR と評価されない限りx // y返され、 OR と評価された場合に返されます。xxnullfalsey

grpこれは空の配列だけでなく、完全に欠けているケースも処理します。

関連情報