配列を含む2つのJSONファイルがあります(bashのカールを使用してRestAPIから抽出されます)。どちらのファイルも、.result
上に保持する必要があるオブジェクトを含む配列です。最初のフィールドには、1つのフィールドと空のフィールドを.name
含む多くの(100を超える)異なるフィールドがあります。.ip_address
2番目のエントリには、インターフェイス、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ファイル配列にインデックスを構築するためにも使用されます。この関数は、関数を使用してマージされた一致するオブジェクト(例ではペア)の配列を提供します。結合とマージ後、キーの両方を含むオブジェクトが残るので、各オブジェクトから後者を削除します。name
cmdb.name
INDEX()
result
JOIN()
add
name
cmdb.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"
}
]
}