jqを使用して改行で区切られた4つのjsonファイルをマージする

jqを使用して改行で区切られた4つのjsonファイルをマージする

4つのJSONファイルをマージしようとしています(今後さらに2つを追加する可能性があります)。改行で区切られたJSONファイル間の唯一の共通要素は「vulnid」です。

File 1: 
{"vulnid":"cve1", "product":"product1"}
{"vulnid":"cve2", "product":"product2"}
{"vulnid":"cve3", "product":"product3"}
{"vulnid":"cve4", "product":""}
{"vulnid":"cve5", "product":""}
{"vulnid":"cve6", "product":""}

File 2: 
{"vulnid":"cve1", "version":"version1"}
{"vulnid":"cve2", "version":"version2"}
{"vulnid":"cve3", "version":"version3"}
{"vulnid":"cve4", "version":"version4"}

File 3: 
{"vulnid":"cve1", "patch":"patch1"}
{"vulnid":"cve2", "patch":"patch2"}
{"vulnid":"cve3", "patch":"patch3"}
{"vulnid":"cve4", "patch":""}

File 4: 
{"vulnid":"cve1", "speed":"speed1"}
{"vulnid":"cve2", "power":"power2"}
{"vulnid":"cve3", "amps":"amps3"}
{"vulnid":"cve4", "product":"product4"}
{"vulnid":"cve4", "patch":"patch4"}


Required output:
{"vulnid":"cve1", "product":"product1", "version":"version1", "patch":"patch1", "speed":"speed1"}
{"vulnid":"cve2", "product":"product2", "version":"version2", "patch":"patch2", "power":"power2"}
{"vulnid":"cve3", "product":"product3", "version":"version3", "patch":"patch3", "amps":"amps3"}
{"vulnid":"cve4", "product":"product4", "version":"version4", "patch":"patch4"}
{"vulnid":"cve5", "product":""}
{"vulnid":"cve6", "product":""}

私が今まで試したこと:

jq -s '.[0] * .[1] * .[3] * .[4]' json1 json2 json3 json4
jq -s '.[0] + .[1] + .[3] + .[4]' json1 json2 json3 json4

...そして、jqのさまざまな組み合わせはすべて間違った結果を提供し、ツールについて私が理解していないことを示しています。

「vulnid」フィールドとjqフィールドを使用してこのマージを実行できますか?

ベストアンサー1

最短jq解決策:

jq -sc 'group_by(.vulnid)[] | add' file*.json

出力:

{"vulnid":"cve1","product":"product1","version":"version1","patch":"patch1","speed":"speed1"}
{"vulnid":"cve2","product":"product2","version":"version2","patch":"patch2","power":"power2"}
{"vulnid":"cve3","product":"product3","version":"version3","patch":"patch3","amps":"amps3"}
{"vulnid":"cve4","product":"product4","version":"version4","patch":"patch4"}
{"vulnid":"cve5","product":""}
{"vulnid":"cve6","product":""}

おすすめ記事