如何使用jq对数组中同sys字段值的元素的all字段求和?
正确的jq分组求和实现方法
你之前用的.[] | (.all +.all)之所以得到2 28,是因为这个表达式会遍历数组里的每个元素,然后对单个元素的all字段做自加运算——第一个元素的1+1=2,第二个的14+14=28,完全没做到分组求和的逻辑~
要实现按sys字段分组,再对每组的all求和,你可以用jq的group_by和add组合来完成,具体分两种场景:
场景1:只需要求和的数值结果
如果你只想要最终的求和数字(比如示例里的15),可以用这个表达式:
group_by(.sys)[] | ([.[]].all | add)
执行命令示例:
echo '[ { "all": 1, "sys": "bus" }, { "all": 14, "sys": "bus" } ]' | jq 'group_by(.sys)[] | ([.[]].all | add)'
输出结果就是15,完全符合你的期望。
场景2:保留分组的sys标识
如果想要同时看到每个sys对应的求和结果(方便后续扩展多分组场景),可以用这个带结构的表达式:
group_by(.sys)[] | {sys: .[0].sys, total_all: ([.[]].all | add)}
执行后会输出:
{ "sys": "bus", "total_all": 15 }
要是你的数组里有多个不同sys的元素,比如加上{ "all": 5, "sys": "car" },这个表达式会分别输出每个分组的结果,非常灵活。
表达式逻辑拆解
group_by(.sys):把原数组中sys字段值相同的元素归类到同一个子数组里,完成分组;[]:遍历每个分组后的子数组;[.[]].all:提取当前分组里所有元素的all字段,形成一个新的数值数组;add:对这个数值数组里的所有元素求和。
内容的提问来源于stack exchange,提问作者user2470865
相关产品推荐
相关产品推荐

