如何使用jq分组和总和?

时间:2018-02-28 12:24:13

标签: json jq

我有以下JSON:

{  
  "groupId1" : {
     "list" : [
       {
       "field1": "somevalue",
       "count": 2,
       "field3": "somevalue"
       },
       {
       "field1": "somevalue",
       "count": 3,
       "field3": "somevalue"
       }
     ]
   },
  "groupId2" : {
     "list" : [
       {
       "field1": "somevalue",
       "count": 0,
       "field3": "somevalue"
       },
       {
       "field1": "somevalue",
       "count": 4,
       "field3": "somevalue"
       }
     ]
   },     
 ...
}

我想要实现的结果(使用jq)是:

[
  "groupId1":5,
  "groupId2":4
]

每个组只有一个“list”元素。

我明白我应该使用group by和sum,但是我无法让它工作。

2 个答案:

答案 0 :(得分:1)

jq 解决方案:

jq '. as $o | [ keys_unsorted[] 
                | {(.) : (reduce $o[.].list[] as $i (0; . + $i.count))} ] | add' file.json

输出:

{
  "groupId1": 5,
  "groupId2": 4
}

答案 1 :(得分:0)

这是在〜/ .jq或jq“标准库”中有以下定义的情况之一:

def sigma(stream): reduce stream as $x (null; . + $x );

有了这个,你可以写出非常易读:

map_values( sigma(.list[] | .count ))