计数并删除jq中的重复项

问题描述:

我有一个对象数组,我想删除此数组中的一些重复项,但我想保留重复计数。计数并删除jq中的重复项

我输入的是:

[ 
    { 
     "foo": 1, 
     "bar": "a", 
     "baz": "whatever" 
    }, 
    { 
     "foo": 1, 
     "bar": "a", 
     "baz": "hello" 
    }, 
    { 
     "foo": 1, 
     "bar": "b", 
     "baz": "world" 
    } 
] 

(如果它是重要的,但一个对象的唯一性是基于foobar,不baz不知道

然后期望输出的一个例子是:

[ 
    { 
     "foo": 1, 
     "bar": "a", 
     "baz": "whatever", 
     "count": 2 
    }, 
    { 
     "foo": 1, 
     "bar": "b", 
     "baz": "world", 
     "count": 1 
    } 
] 

甚至:

[ 
    { 
     "count": 2, 
     "data": { 
      "foo": 1, 
      "bar": "a", 
      "baz": "whatever" 
     } 
    }, 
    ... 
] 

我知道如何做唯一性部分(与unique_by([.foo, .bar])),但不是计数部分。

您可以使用基于group_by以下命令:

group_by(.foo,.bar) 
| map(.[]+{"count":length}) 
| unique_by(.foo,.bar) 

输出:

[ 
    { 
    "foo": 1, 
    "bar": "a", 
    "baz": "whatever", 
    "count": 2 
    }, 
    { 
    "foo": 1, 
    "bar": "b", 
    "baz": "world", 
    "count": 1 
    } 
] 

你提到的其他输出可以用这个命令来实现:

group_by(.foo,.bar) 
| map({"count":length,"data":(unique_by(.foo,.bar)[])}) 

输出:

[ 
    { 
    "count": 2, 
    "data": { 
     "foo": 1, 
     "bar": "a", 
     "baz": "whatever" 
    } 
    }, 
    { 
    "count": 1, 
    "data": { 
     "foo": 1, 
     "bar": "b", 
     "baz": "world" 
    } 
    } 
] 
+0

谢谢,它的工作原理!对于第二个输出来说,做“数据”不是更简单吗:第一个? – GrecKo

+0

是的,也可以使用。而且会更简单! – hek2mgl

+0

哦,是的!删除。 – hek2mgl

下面是使用peak的的GROUPS_BY代替group_by/1避免排序的解决方案:

def GROUPS_BY(stream; f): reduce stream as $x ({}; .[$x|f] += [$x]) | .[] ; 

    GROUPS_BY(.[]; {foo,bar}|tostring) 
| .[0].count = length 
| .[0]