基于对象键/值的对象内部的Concat 2数组

时间:2019-03-23 09:23:30

标签: json jq

我有多个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" ]
}

3 个答案:

答案 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仅出于简短起见而给出)