计数并删除jq中的重复项
问题描述:
我有一个对象数组,我想删除此数组中的一些重复项,但我想保留重复计数。计数并删除jq中的重复项
我输入的是:
[
{
"foo": 1,
"bar": "a",
"baz": "whatever"
},
{
"foo": 1,
"bar": "a",
"baz": "hello"
},
{
"foo": 1,
"bar": "b",
"baz": "world"
}
]
(如果它是重要的,但一个对象的唯一性是基于foo
和bar
,不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"
}
}
]
答
下面是使用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]
谢谢,它的工作原理!对于第二个输出来说,做“数据”不是更简单吗:第一个? – GrecKo
是的,也可以使用。而且会更简单! – hek2mgl
哦,是的!删除。 – hek2mgl