如何使用jq将分组后的数组重塑为指定汇总格式?
用jq实现数组到目标结构的转换
嘿,这需求用jq处理起来非常直观,我给你两种可行的写法,其中一种简洁高效,另一种更偏过程式,你可以按需选择:
方法一:用from_entries(推荐,简洁易读)
这种方法利用jq内置的from_entries函数,专门用来把{key, value}结构的数组转换成键值对对象,搭配数组长度直接获取总Count:
完整jq命令
jq '{Count: length, Agents: (map({key: .Agents, value: .Count}) | from_entries)}'
逐段解释
length:直接读取输入数组的元素个数,刚好对应目标结构里的Count:7map({key: .Agents, value: .Count}):把原始数组里的每个对象,转换成{key: "a", value:1}这种标准的键值对结构数组from_entries:将上面的键值对数组直接转换为一个对象,也就是你要的"Agents": {"a":1, "b":50,...}部分
方法二:用reduce(过程式写法)
如果你想更清晰地看到每一步的累加过程,可以用reduce遍历数组,逐步构建目标对象:
完整jq命令
jq 'reduce .[] as $item ({Count:0, Agents:{}}; .Count +=1 | .Agents[$item.Agents] = $item.Count)'
逐段解释
- 初始值
{Count:0, Agents:{}}:先定义一个空的目标结构 .Count +=1:每遍历一个元素,就把Count加1.Agents[$item.Agents] = $item.Count:把当前元素的Agents值作为键,Count值作为值,添加到Agents对象里
测试示例
假设你的原始数据存在data.json文件里,直接运行上面的命令就能得到你想要的结果:
输入(data.json):
[ { "Agents": "a", "Count": 1 }, { "Agents": "b", "Count": 50 }, { "Agents": "c", "Count": 25 }, { "Agents": "d", "Count": 1 }, { "Agents": "e", "Count": 4 }, { "Agents": "f", "Count": 4 }, { "Agents": "g", "Count": 4 } ]
输出:
{ "Count": 7, "Agents": { "a": 1, "b": 50, "c": 25, "d": 1, "e": 4, "f": 4, "g": 4 } }
内容的提问来源于stack exchange,提问作者BrandonH
相关产品推荐
相关产品推荐

