2017-10-19 95 views
1

我有一個對象數組,我想刪除此數組中的一些重複項,但我想保留重複計數。計數並刪除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])),但不是計數部分。

回答

1

您可以使用基於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

1

下面是使用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]