如何用jq对未知键对应的值进行求和计算?
用jq实现JSON数组键值累加求和
需求说明
给定一个包含多个JSON对象的数组,需要生成一个新的JSON对象,将数组中所有对象的相同键对应的值累加,最终得到每个键的总和。
示例输入
[ { "a": 10, "b": 20 }, { "a": 11, "c": 30 }, { "b": 21, "c": 31 } ]
示例输出
{ "a": 21, "b": 41, "c": 61 }
jq实现方案
可以直接用jq的内置函数完成这个需求,核心思路是遍历数组中的每个对象,将所有键值对合并并累加对应值:
jq 'reduce .[] as $item ({}; reduce ($item | to_entries[]) as $entry (.; .[$entry.key] += $entry.value))' input.json
命令解释
reduce .[] as $item ({}; ...):遍历输入数组的每个元素($item),初始值设为一个空对象{}reduce ($item | to_entries[]) as $entry (.; ...):把每个对象转换为键值对数组(比如{"a":10}会转成[{"key":"a","value":10}]),再遍历这些键值对.[$entry.key] += $entry.value:在结果对象中,对当前键对应的值进行累加,不存在的键会自动创建并赋值为对应值
如果是在命令行直接输入JSON内容,也可以用管道执行:
echo '[ {"a":10,"b":20}, {"a":11,"c":30}, {"b":21,"c":31} ]' | jq 'reduce .[] as $item ({}; reduce ($item | to_entries[]) as $entry (.; .[$entry.key] += $entry.value))'
其他实现方式(可选)
如果没有jq,也可以用Python快速实现,写个简单脚本即可:
import json import sys data = json.load(sys.stdin) result = {} for item in data: for k, v in item.items(): result[k] = result.get(k, 0) + v print(json.dumps(result, indent=2))
使用方式:
python sum_keys.py < input.json
内容的提问来源于stack exchange,提问作者dertoni
相关产品推荐
相关产品推荐

