如何使用jq命令合并两个JSON报告的examples数组?
问题描述
我有如下两个JSON报告文件:
report1.json
{"examples": [{"description": "desc 1","full_description": "full_description 1","status": "status 1","file_path": "file_path 1","run_time": 0.01}]}
report2.json
{"examples": [{"description": "desc 2","full_description": "full_description 2","status": "status 2","file_path": "file_path 2","run_time": 0.02}]}
我希望合并这两个文件,得到如下结果:
{"examples": [{"description": "desc 1","full_description": "full_description 1","status": "status 1","file_path": "file_path 1","run_time": 0.01},{"description": "desc 2","full_description": "full_description 2","status": "status 2","file_path": "file_path 2","run_time": 0.02}]}
我曾尝试使用命令 jq -s '.[0] * .[1]' report1.json report2.json 但未成功,请问有什么可行的jq命令解决方案?
解决方案
你之前用的*运算符是对象合并逻辑,当两个对象存在相同键名时,后者会直接覆盖前者的对应值,所以.[0] * .[1]会让report2的examples数组覆盖report1的,无法实现数组合并的效果。
以下是两种可行的解决命令:
方案1:利用-s选项展开并合并数组
jq -s '{ examples: [.[].examples[]] }' report1.json report2.json
逻辑说明:
-s参数会把所有输入的JSON文件内容整合为一个数组.[].examples[]遍历数组中每个对象的examples数组,取出所有内部元素- 最后将这些元素重新包裹到
examples数组中,组成目标结构
方案2:用reduce处理多输入对象
jq -n 'reduce inputs as $in ({}; .examples += $in.examples)' report1.json report2.json
逻辑说明:
-n让jq从空状态开始处理reduce inputs as $in ({}; ...)遍历每个输入的JSON对象.examples += $in.examples将每个输入对象的examples数组追加到结果对象的examples键下(若初始无该键则自动创建)
这两个命令都能生成你需要的合并结果。
内容的提问来源于stack exchange,提问作者Arkadius Reymond
相关产品推荐
相关产品推荐

