我是jq的新手,我不太清楚如何转换格式如下的JSON文件:
[
{
"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
,latitude
,longitude
的唯一组合,但是没有如何添加名称的方法放入数组。
答案 0 :(得分:1)
这是使用group_by
的简单解决方案:
group_by(.code)
| map( reduce .[] as $x (.[0] | del(.name);
.people += [$x.name]) )
答案 1 :(得分:1)
这是比使用group_by
的解决方案更有效的解决方案,因为后者涉及一种排序。
可以使用内置的INDEX/1
和通用函数aggregate_by
定义为:
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])
答案 2 :(得分:-1)
对于那些可能正在寻找替代品的人,这是基于 jtc
和标准的Unix实用程序的解决方案:
1。首先让我们对所有唯一的code
进行排序:
bash $ jtc -w'<code>l:' file.json | sort -u
"AAA"
"BBB"
bash $
2。然后将每个值通过xargs
传递到jtc
以通过name
合并每个记录(就地应用结果,切换-f
)。注意:下面,xarg的选项-t
仅用于演示目的,并非真正需要:
bash $ jtc -w'<code>l:' file.json | sort -u | xargs -L1 -I{} -t jtc -w"[code]:<{}>[-1][name]" -mi'[code]:<{}>1:[-1][name]' -f file.json
jtc -w[code]:<AAA>[-1][name] -mi[code]:<AAA>1:[-1][name] -f file.json
jtc -w[code]:<BBB>[-1][name] -mi[code]:<BBB>1:[-1][name] -f file.json
bash $
3。最后删除所有合并的记录:
bash $ jtc -w'<code>l:' file.json | sort -u | xargs -L1 -I{} -t jtc -w"[code]:<{}>1: [-1]" -p -f file.json
jtc -w[code]:<AAA>1: [-1] -p -f file.json
jtc -w[code]:<BBB>1: [-1] -p -f file.json
bash $
file.json
现在包含所需的结果:
bash $ cat file.json
[
{
"code": "AAA",
"latitude": 11,
"longitude": 22,
"name": [
"person 1",
"person 2"
]
},
{
"code": "BBB",
"latitude": 33,
"longitude": 44,
"name": [
"person 3",
"person 4"
]
}
]
bash $
***如果您想将标签name
重命名为people
,请应用其他步骤:
bash $ jtc -w'<name>l: <>v' -u'"people"' file.json
[
{
"code": "AAA",
"latitude": 11,
"longitude": 22,
"people": [
"person 1",
"person 2"
]
},
{
"code": "BBB",
"latitude": 33,
"longitude": 44,
"people": [
"person 3",
"person 4"
]
}
]
bash $
jtc
用户指南可以在这里找到:https://github.com/ldn-softdev/jtc/blob/master/User%20Guide.md