マージするjq式

マージするjq式

Junos REST APIには、次のJSONドキュメントがあります。選択したいくつかの項目に文書を縮小しようとしています。この目標をどのように達成できますか?

予想されるJSON:

[
  {  "status": .member-status[0].data,
     "serial": .member-serial-number[0].data,
     "slot": .fpc-slot[0].data
  },
  ...
] 

生のJSON:

{
  "member-status": [
    {
      "data": "Prsnt"
    }
  ],
  "member-id": [
    {
      "data": "0"
    }
  ],
  "fpc-slot": [
    {
      "data": "(FPC 0)"
    }
  ],
  "member-serial-number": [
    {
      "data": "serNo1"
    }
  ],
  "member-model": [
    {
      "data": "ex4400-24t"
    }
  ],
  "member-priority": [
    {
      "data": "255"
    }
  ],
  "member-mixed-mode": [
    {
      "data": "N"
    }
  ],
  "member-route-mode": [
    {
      "data": "VC"
    }
  ],
  "member-role": [
    {
      "data": "Master*"
    }
  ],
  "neighbor-list": [
    {}
  ]
}
{
  "member-status": [
    {
      "data": "NotPrsnt"
    }
  ],
  "member-id": [
    {
      "data": "1"
    }
  ],
  "fpc-slot": [
    {
      "data": "(FPC 1)"
    }
  ],
  "member-serial-number": [
    {
      "data": "serNo2"
    }
  ],
  "member-model": [
    {}
  ]
}

ベストアンサー1

次のようにする必要があります。

jq -s '
  map(
    {
      "status": ."member-status"[0].data,
      "serial": ."member-serial-number"[0].data,
      "slot"  : ."fpc-slot"[0].data
    }
  )' your-file.json

または、コードをもう少し細分化してみてください。

jq -s '
  map({
    "status": ."member-status",
    "serial": ."member-serial-number",
    "slot"  : ."fpc-slot"
  } | with_entries(.value |= .[0].data))' your-file.json

または、3つすべての単純化されたキーが2番目に分離された単語であるためです-

jq -s '
  map({"member-status", "member-serial-number", "fpc-slot"} |
  with_entries(.value |= .[0].data | .key |= split("-")[1]))' your-file.json

あなたのサンプルは以下を提供します。

[
  {
    "status": "Prsnt",
    "serial": "serNo1",
    "slot": "(FPC 0)"
  },
  {
    "status": "NotPrsnt",
    "serial": "serNo2",
    "slot": "(FPC 1)"
  }
]

-s入力の複数のリンクされたJSONをJSON配列に結合して、指定されたオブジェクトmap()を各メンバーにマップします。あるいは、配列メンバーを繰り返して結果から新しい配列を構築することもできmap({...})ます。[ .[] | {...} ]

おすすめ記事