如何用jq编写脚本合并任意数量JSON文件且不生成中间文件?
合并任意数量JSON文件的高效方案
你无需通过循环多次调用jq,也不用依赖进程传递中间结果,一次调用jq就能完成所有文件的合并,全程不会生成中间文件。
核心命令
使用jq的-s选项将所有输入文件读入一个JSON数组,再通过reduce遍历数组逐个合并对象:
jq -s 'reduce .[] as $item ({}; . * $item)' file1.json file2.json file3.json ... > merged.json
命令说明
-s(--slurp):将所有输入的JSON文档合并为一个数组,比如3个对象文件会生成[obj1, obj2, obj3]格式的数组。reduce .[] as $item ({}; . * $item):从空对象{}起始,依次将数组中的每个对象$item与当前结果合并(.*$item是jq的对象合并操作,后续对象会覆盖前面对象的同名键)。
简化写法(可选)
如果你的jq版本支持,也可以用更简洁的写法实现相同效果:
jq -s '.[0] * .[1:] | add' file1.json file2.json ...
不过reduce的写法更直观,便于理解合并逻辑。
优势对比
相比你之前尝试的循环调用方式,这个方案:
- 避免多次启动jq进程的额外开销,效率更高;
- 语法简洁,无需处理复杂的管道与进程替换;
- 全程在单个jq进程内完成,无中间文件或临时数据传递问题。
内容的提问来源于stack exchange,提问作者symcbean
相关产品推荐
相关产品推荐

