使用 jq 将多个 json 合并为单个 json

Combine multiple json to single json using jq

我是 jq 的新手,有一段时间一直被这个问题困扰。任何帮助都是可观的。

我有两个 json 个文件,

在file1.json中:

{
    "version": 4,
    "group1": [
        {
            "name":"olditem1",
            "content": "old content"
        }
    ],
    "group2": [
        {
            "name":"olditem2"
        }
    ]
}

在file2.json中:

{
    "group1": [
        {
            "name" : "newitem1"
        },
        {
            "name":"olditem1",
            "content": "new content"
        }
    ],
    "group2": [
        {
            "name" : "newitem2"
        }
    ]
}

预期结果是:

{
    "version": 4,
    "group1": [
        {
            "name":"olditem1",
            "content": "old content"
        },
        {
            "name" : "newitem1"
        }
    ],
    "group2": [
        {
            "name":"olditem2"
        },
        {
            "name" : "newitem2"
        }
    ]
}

合并条件:

  1. 只需要合并 group1 和 group2
  2. 仅按名称匹配

我试过了

jq -S '.group1+=.group1|.group1|unique_by(.name)' file1.json file2.json

但这是过滤组 1,所有其他信息都丢失了。

此方法使用 INDEX 基于其 .name 字段创建唯一元素的字典,reduce 迭代要考虑的组字段,并创建初始状态在删除要使用 del.

单独处理的组文件后,使用 add 组合 slurped (-s) 输入文件
jq -s '
  [ "group1", "group2" ] as $gs | . as $in | reduce $gs[] as $g (
    map(del(.[$gs[]])) | add; .[$g] = [INDEX($in[][$g][]; .name)[]]
  )
' file1.json file2.json
{
  "version": 4,
  "group1": [
    {
      "name": "olditem1",
      "content": "new content"
    },
    {
      "name": "newitem1"
    }
  ],
  "group2": [
    {
      "name": "olditem2"
    },
    {
      "name": "newitem2"
    }
  ]
}

Demo