我有一个JSON列表,我想在命令行上合并。
输入:[
{
"ipaddress": "10.10.10.222",
"name": "alice"
},
{
"ipaddress": "10.20.20.77",
"name": "bob"
},
{
"version": "6.7",
"name": "alice"
},
{
"version": "5.2.2",
"name": "bob"
}
]
预期产出:
{"name": "alice", "ipaddress": "10.10.10.222", "version": "6.7"},
{"name": "bob", "ipaddress": "10.20.20.77", "version": "5.2.2"}
你可以帮帮我吗?谢谢。
贝恩德
答案 0 :(得分:3)
jq -c 'group_by(.name)[]|add' input.json
生成一个JSON对象流(即没有插入逗号)。
最好还是完全避免group_by/1
,因为它涉及到一种:
def add_by(f):
reduce .[] as $x ({}; ($x|f) as $f | .[$f] += [$x])
| [.[] | add];
add_by(.name)
答案 1 :(得分:2)
如果样本数据在data.json
中,则命令
$ jq -Mr '[ group_by(.name)[] | add | tojson ] | join(",\n")' data.json
将产生输出
{"name": "alice", "ipaddress": "10.10.10.222", "version": "6.7"},
{"name": "bob", "ipaddress": "10.20.20.77", "version": "5.2.2"}
但是,如果实际需要的是单个对象数组,那么命令
$ jq -M '[group_by(.name)[] | add]' data.json
产生
[
{
"ipaddress": "10.10.10.222",
"name": "alice",
"version": "6.7"
},
{
"ipaddress": "10.20.20.77",
"name": "bob",
"version": "5.2.2"
}
]