如何用单条jq命令合并多份JSON并添加同级对象
问题描述
我有如下4份JSON文件:
cats.json
{"cats": [{"name": "fluffles","age": 10,"color": "white"}]}
dogs.json
{"dogs": [{"name": "sam","age": 5,"color": "black and white"},{"name": "rover","age": 2,"color": "brown and white"}]}
snakes.json
{"snakes": [{"name": "noodles","age": 10,"color": "green"}]}
owners.json
{"owners": ["peter","william","sally"]}
我原先分两步完成合并:
- 第一步执行
jq -s '{"animals": .} ' cats.json dogs.json snakes.json > animals.json,将前三个文件内容归到animals对象下生成animals.json - 第二步执行
jq -s '.[0] + .[1]' animals.json owners.json,将owners作为同级字段合并。
请问能否仅用一条jq命令完成上述所有操作,最终输出包含animals和owners两个顶级字段的JSON文件?
解决方案
可以直接用单条命令实现需求:
jq -n '{"animals": [inputs] | add} + input' cats.json dogs.json snakes.json owners.json
命令说明:
-n参数让jq不自动读取输入,方便手动控制输入的读取顺序- 前三个输入(cats、dogs、snakes)通过
inputs读取,合并成数组后用add把三个文件的顶级对象整合成一个,赋值给animals字段 - 最后一个
input读取第四个文件owners.json的内容,直接和前面的animals对象合并,最终输出的结构完全符合要求。
如果更习惯用slurp模式(-s),也可以用下面的写法,效果完全一致:
jq -s '{"animals": .[0:3] | add} + .[3]' cats.json dogs.json snakes.json owners.json
需要输出到文件的话,在命令末尾加> 目标文件名.json即可。
内容的提问来源于stack exchange,提问作者dogman
相关产品推荐
相关产品推荐

