如何使用jq合并两个JSON文件并对同名键值进行求和聚合
合并JSON并按公共字段聚合数值的shell解决方案
基于jq的实现(无额外依赖)
直接使用你当前在用的jq工具即可完成需求,无需安装其他工具,适配绝大多数Linux/macOS环境。
核心逻辑
- 合并两个输入JSON数组的所有条目
- 按公共标识字段
A分组 - 每组内对数值字段
B、C转数字求和后转回字符串,匹配你要求的输出格式 - 重组为结果数组输出
封装好的shell脚本
创建脚本文件merge_json.sh,内容如下:
#!/bin/bash # 用法:./merge_json.sh <输入文件1> <输入文件2> [输出文件路径] if [ $# -lt 2 ]; then echo "参数错误:请至少传入2个待合并的JSON文件路径" echo "示例:./merge_json.sh Input1.json Input2.json Output.json" exit 1 fi INPUT1="$1" INPUT2="$2" OUTPUT="${3:-/dev/stdout}" # jq处理逻辑,默认适配B、C字段求和,需要更多字段可替换为下方通用逻辑 jq -s ' add | group_by(.A) | map( { "A": .[0].A, "B": (map(.B | tonumber) | add | tostring), "C": (map(.C | tonumber) | add | tostring) } ) ' "$INPUT1" "$INPUT2" > "$OUTPUT" [ "$OUTPUT" != "/dev/stdout" ] && echo "合并完成,结果已写入:$OUTPUT"
如果你需要适配更多动态数值字段(无需硬编码B、C),可以把脚本里的jq逻辑替换为以下通用版本:
add | group_by(.A) | map( reduce .[] as $item ( {"A": .[0].A}; reduce ($item | keys_unsorted[] | select(. != "A")) as $k ( .; .[$k] = ((.[$k] // "0" | tonumber) + ($item[$k] | tonumber) | tostring) ) ) )
使用方法
- 给脚本添加执行权限:
chmod +x merge_json.sh - 执行合并:
./merge_json.sh Input1.json Input2.json Output.json - 也可以不指定输出文件,直接在终端打印结果:
./merge_json.sh Input1.json Input2.json
执行后得到的Output.json完全匹配你给出的预期结果。
内容的提问来源于stack exchange,提问作者Ateny
相关产品推荐
相关产品推荐

