用jq重新构造JSON文件:在数组中重新组合值
我是jq新手,我不太明白如何转换JSON文件,格式如下:用jq重新构造JSON文件:在数组中重新组合值,json,group-by,aggregate,jq,Json,Group By,Aggregate,Jq,我是jq新手,我不太明白如何转换JSON文件,格式如下: [ { "name": "person 1", "code": "AAA", "latitude": 11, "longitude": 22 }, { "name": "person 2", "code": "AAA", "latitude": 11, "longitude": 22 }, { "name": "person 3", "
[
{
"name": "person 1",
"code": "AAA",
"latitude": 11,
"longitude": 22
},
{
"name": "person 2",
"code": "AAA",
"latitude": 11,
"longitude": 22
},
{
"name": "person 3",
"code": "BBB",
"latitude": 33,
"longitude": 44
},
{
"name": "person 4",
"code": "BBB",
"latitude": 33,
"longitude": 44
}
]
为此:
[
{
"code": "AAA",
"latitude": 11,
"longitude": 22,
"people": ["person 1", "person 2"]
},
{
"code": "BBB",
"latitude": 33,
"longitude": 44,
"people": ["person 3", "person 4"]
}
]
我知道了如何使用
map()
和unique
来获得code
、纬度
、经度
的唯一组合,但不知道如何将名称添加到数组中。下面是一个使用group\u by
的简单解决方案:
group_by(.code)
| map( reduce .[] as $x (.[0] | del(.name);
.people += [$x.name]) )
这里有一个比使用
groupby
更有效的解决方案,因为后者涉及排序
使用内置的索引/1
,以及通用函数聚合可以实现效率,其定义如下:
def aggregate_by(s; f; g):
reduce s as $x (null; .[$x|f] += [$x|g]);
aggregate_by(.[]; .code; .name) as $dict
| INDEX(.code)
| [.[]]
| map(del(.name) | .person = $dict[.code])