我有多个json对象,如果对象键与下一个json对象具有相同的值,则在合并数组时可能会更少。我正在尝试通过jq完成此操作。
我认为我必须首先使用group_by(.name)来对匹配键进行分组。我还使用slurp首先将所有对象包装到一个大数组中。
我暂时没有任何工作。
给定:
{
"name": "a",
"list": [ "a1", "a2" ]
}
{
"name": "a",
"list": [ "a3", "a4" ]
}
{
"name": "b",
"list": [ "b1", "b2" ]
}
应导致:
{
"name": "a",
"list": [ "a1", "a2", "a3", "a4" ]
}
{
"name": "b",
"list": [ "b1", "b2" ]
}
答案 0 :(得分:3)
您可以像这样使用reduce
:
$ jq -c -n 'reduce inputs as $p ({}; .[$p.name] |= { name : $p.name, list : (.list + $p.list) }) | .[]' file
{"name":"a","list":["a1","a2","a3","a4"]}
{"name":"b","list":["b1","b2"]}
答案 1 :(得分:1)
这是一个简单有效的解决方案,它使用常见的“聚合依据”技术:
reduce inputs as $kv ({}; .[$kv.name] += $kv.list)
| keys_unsorted[] as $k
| {name: $k, list: .[$k]}
由于此处使用inputs
,因此应指定jq的-n命令行选项。
答案 2 :(得分:0)
或者,您可以使用基于步行路径的Unix实用程序 jtc
来实现您的问题:
bash $ <file.json jtc -J | jtc -w'[name]:<dup>Q:[^0]<dup>s[-1][list]' -mi'[name]:<dup>Q:[-1][list]' | jtc -w'[name]:<.>q:[-1]' -r
{ "list": [ "a1", "a2", "a3", "a4" ], "name": "a" }
{ "list": [ "b1", "b2" ], "name": "b" }
bash $
({-r
仅出于简短起见而给出)