如何使用jq对多个JSON文件分别索引后合并为单个JSON文件
解决方案
方法1(推荐,大文件性能更好)
直接使用jq内置的inputs变量遍历所有文件,逐个转换后合并:
jq -n 'reduce inputs as $file_content ([]; . + ($file_content | to_entries))' ./your_json_dir/*.json
将命令中的./your_json_dir/*.json替换为你实际存放JSON文件的路径匹配规则即可。
逻辑说明
-n禁用jq默认读取首个输入作为处理对象的行为,配合inputs逐个读取所有输入的JSON文件reduce inputs as $file_content ([]; ...)初始化结果为空数组,遍历每一个输入文件$file_content | to_entries对当前文件的数组单独做索引转换,保留原数组内的索引作为key. + (...)将转换后的数组追加到总结果中
方法2(slurp模式,写法更简洁)
如果你习惯用slurp模式合并文件,也可以用如下等价命令:
jq -s 'map(to_entries) | add' ./your_json_dir/*.json
逻辑说明
-s参数会把所有输入的JSON文件内容打包为一个数组,每个元素对应一个文件的原始JSON内容map(to_entries)对每一个文件的内容单独执行索引转换add将所有转换后的数组合并为最终结果
效果验证
以你提供的mock1.json、mock2.json作为输入,最终输出结果如下:
[ { "key": 0, "value": { "name": "John" } }, { "key": 1, "value": { "name": "Mary" } }, { "key": 0, "value": { "name": "Nick" } }, { "key": 1, "value": { "name": "Luke" } } ]
所有元素的key都保留了其在原所属数组内的原始索引,符合需求。
内容的提问来源于stack exchange,提问作者Phoenix-C
相关产品推荐
相关产品推荐

