異なるキーのJSON配列をマージする

異なるキーのJSON配列をマージする

配列を含む2つのJSONファイルがあります(bashのカールを使用してRestAPIから抽出されます)。どちらのファイルも、.result上に保持する必要があるオブジェクトを含む配列です。最初のフィールドには、1つのフィールドと空のフィールドを.name含む多くの(100を超える)異なるフィールドがあります。.ip_address2番目のエントリには、インターフェイス、IPアドレス、さまざまなフィールド名の名前(キー)などの追加情報が含まれています。最初のファイルのキーは2番目のファイルのキーとは異なりますが、関連する必要があります(もちろん、キーフィールドの名前を変更することができましたが、キーのデータは通常大文字と小文字が混在しています)。

ip_address.name最初のJSONを同じフィールドで上書きして追加データを追加できるようにマージしたいと思います。

私はそれが配列の乗算または減算と加算であることを知っていますが、私が見つけた例では正しい結果を得ることができません。解決策をいただきありがとうございます。

仕える人:

{
  "result": [
    {
      "os": "Microsoft Windows Server 2019 Standard",
      "name": "SERVER1",
      "ip_address": ""
    },
    {
      "os": "Microsoft Windows Server 2019 Standard",
      "name": "SERVER2",
      "ip_address": ""
    },
    {
      "os": "Microsoft Windows Server 2019 Standard",
      "name": "server3",
      "ip_address": ""
     },
    {
      "os": "Microsoft Windows Server 2016 Standard",
      "name": "server4",
      "ip_address": ""
     }
  ]
}

ips.txt

{
  "result": [
    {
      "interface": "Intel Wireless-AC 9560 160MHz",
      "cmdb.name": "server1",
      "ip_address": "10.0.0.10"
    },
    {
      "interface": "Wi-Fi",
      "cmdb.name": "server2",
      "ip_address": "10.0.0.10"
    },
    {
      "interface": "Intel Dual Band Wireless-AC 8265",
      "cmdb.name": "server4",
      "ip_address": "10.0.0.10"
    }
  ]
}

サーバーデータの予想出力は次のとおりです。

{
  "result": [
    {
      "os": "Microsoft Windows Server 2019 Standard",
      "name": "SERVER1",
      "interface": "Intel Wireless-AC 9560 160MHz",
      "ip_address": "10.0.0.10"
    },
    {
      "os": "Microsoft Windows Server 2019 Standard",
      "name": "SERVER2",
      "interface": "Wi-Fi",
      "ip_address": "10.0.0.10"
    },
    {
      "os": "Microsoft Windows Server 2019 Standard",
      "name": "server3",
      "ip_address": ""
     },
    {
      "os": "Microsoft Windows Server 2016 Standard",
      "name": "server4",
      "interface": "Intel Dual Band Wireless-AC 8265",
      "ip_address": "10.0.0.10"
     }
  ]
}

答え1

以下は、リレーショナルJOIN()関数を使用して、キー(サーバー)とキー(IP)の小文字バリアントに対して同じ2つの配列jqの要素を結合します。resultまた、IPファイル配列にインデックスを構築するためにも使用されます。この関数は、関数を使用してマージされた一致するオブジェクト(例ではペア)の配列を提供します。結合とマージ後、キーの両方を含むオブジェクトが残るので、各オブジェクトから後者を削除します。namecmdb.nameINDEX()resultJOIN()addnamecmdb.name

jq '.result = [JOIN(INDEX(input.result[]; ."cmdb.name"|ascii_downcase); .result[]; .name|ascii_downcase) | add | del(."cmdb.name")]' servers.json ips.json

式のjq形式は次のとおりです。

.result =
  [
    JOIN(
      # index on the second file's .cmdb.name key in each result object
      INDEX(
        input.result[];
        ."cmdb.name" | ascii_downcase
      );
      .result[];             # join on the first file's result objects
      .name | ascii_downcase # match using the .name key
    )
    | add               # merge the matched objects
    | del(."cmdb.name") # delete that key we don't want
  ]

結果:

{
  "result": [
    {
      "os": "Microsoft Windows Server 2019 Standard",
      "name": "SERVER1",
      "ip_address": "10.0.0.10",
      "interface": "Intel Wireless-AC 9560 160MHz"
    },
    {
      "os": "Microsoft Windows Server 2019 Standard",
      "name": "SERVER2",
      "ip_address": "10.0.0.10",
      "interface": "Wi-Fi"
    },
    {
      "os": "Microsoft Windows Server 2019 Standard",
      "name": "server3",
      "ip_address": ""
    },
    {
      "os": "Microsoft Windows Server 2016 Standard",
      "name": "server4",
      "ip_address": "10.0.0.10",
      "interface": "Intel Dual Band Wireless-AC 8265"
    }
  ]
}

関連情報