You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用jq合并两个JSON文件并对同名键值进行求和聚合

合并JSON并按公共字段聚合数值的shell解决方案

基于jq的实现(无额外依赖)

直接使用你当前在用的jq工具即可完成需求,无需安装其他工具,适配绝大多数Linux/macOS环境。

核心逻辑

  1. 合并两个输入JSON数组的所有条目
  2. 按公共标识字段A分组
  3. 每组内对数值字段B、C转数字求和后转回字符串,匹配你要求的输出格式
  4. 重组为结果数组输出

封装好的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)
    )
  )
)

使用方法

  1. 给脚本添加执行权限:
    chmod +x merge_json.sh
  2. 执行合并:
    ./merge_json.sh Input1.json Input2.json Output.json
  3. 也可以不指定输出文件,直接在终端打印结果:
    ./merge_json.sh Input1.json Input2.json
    执行后得到的Output.json完全匹配你给出的预期结果。

内容的提问来源于stack exchange,提问作者Ateny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:15:03