2

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

2 回答 2

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"]}
于 2019-03-23T09:54:38.540 回答
1

这是一个简单而有效的解决方案,它使用一种常见的“聚合方式”技术:

reduce inputs as $kv ({}; .[$kv.name] += $kv.list)
| keys_unsorted[] as $k
| {name: $k, list: .[$k]}

由于inputs这里已经使用过,所以应该指定 jq 的 -n 命令行选项。

于 2019-03-23T14:48:29.663 回答