使用 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"
}
]
}
合并条件:
- 只需要合并 group1 和 group2
- 仅按名称匹配
我试过了
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"
}
]
}
我是 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"
}
]
}
合并条件:
- 只需要合并 group1 和 group2
- 仅按名称匹配
我试过了
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"
}
]
}