我有两个要合并的JSON文件,其中一个在这里:
文件1:
文件2:
https://gist.github.com/ArchieHicklin/764812b232a6cdc157d50da40bc033a5
文件1开始有一个拓扑对象和数组,以及许多可以忽略的东西:
{
"type": "Topology",
"arcs": [
[
[16814, 15074],
[71, -45],
[53, 16],
[15, 54],
[55, 18],
[39, 37],
[14, 95],
[59, 24],
[11, 42],
[32, -32],
[21, -3]
],..。
然后进入一个国家数组(这是我想要增加价值的部分):
"objects": {
"ne_110m_admin_0_countries": {
"type": "GeometryCollection",
"geometries": [{
"arcs": [
[0, 1, 2, 3, 4, 5]
],
"type": "Polygon",
"properties": {
"NAME": "Afghanistan",
"NAME_LONG": "Afghanistan",
"ABBREV": "Afg.",
"FORMAL_EN": "Islamic State of Afghanistan",
"POP_EST": 34124811,
"POP_RANK": 15,
"GDP_MD_EST": 64080,
"POP_YEAR": 2017,
"GDP_YEAR": 2016,
"ISO_A2": "AF",
"ISO_A3": "AFG",
"CONTINENT": "Asia",
"REGION_UN": "Asia",
"SUBREGION": "Southern Asia"
}
},文件2具有相同国家/地区的数组,但具有附加值:
{ "NAME": "Afghanistan", "BRANDONE": "Xiaomi", "BRANDTWO": "Apple", "BRANDTHREE": "Huawei", "BRANDFOUR": "Unknown", "BRANDFIVE": "Samsung", "BRANDSIX": "Oppo" },正如你所看到的,文件1和文件2之间的公共值键是"NAME“。
理想情况下,我希望合并这些文件,以便原始文件包含来自另一个文件的额外值,例如:
"objects": {
"ne_110m_admin_0_countries": {
"type": "GeometryCollection",
"geometries": [{
"arcs": [
[0, 1, 2, 3, 4, 5]
],
"type": "Polygon",
"properties": {
"NAME": "Afghanistan",
"NAME_LONG": "Afghanistan",
"ABBREV": "Afg.",
"FORMAL_EN": "Islamic State of Afghanistan",
"POP_EST": 34124811,
"POP_RANK": 15,
"GDP_MD_EST": 64080,
"POP_YEAR": 2017,
"GDP_YEAR": 2016,
"ISO_A2": "AF",
"ISO_A3": "AFG",
"CONTINENT": "Asia",
"REGION_UN": "Asia",
"SUBREGION": "Southern Asia",
"BRANDONE": "Xiaomi",
"BRANDTWO": "Apple",
"BRANDTHREE": "Huawei",
"BRANDFOUR": "Unknown",
"BRANDFIVE": "Samsung",
"BRANDSIX": "Oppo"
}
},我在这里尝试了很多合并答案,但当我合并时
(如jq -s '[ .[0] + .[1] | group_by(.NAME)[] | select(length > 1) | add ]' clean.json world.json)
但我总是以一个错误结束:
jq: error (at file2.json:13575): array ([{"NAME":"A...) and object ({"type":"To...) cannot be added
有没有人知道我想做的事情在jq中是不是可以实现的?为什么我总是得到一个错误?
谢谢。
发布于 2020-12-11 02:01:58
首先构造一个字典,然后使用它执行更新:
jq --argfile new 2.json '
($new | INDEX(.NAME)) as $dict
| .objects.ne_110m_admin_0_countries.geometries[].properties
|= (if $dict[.NAME] then . + $dict[.NAME] else . end)
' 1.json顺便说一下..。
这里最困难的部分是确定相关的路径。jq出手相救:
jq -c 'paths(. == "Afghanistan")' 1.json另一种可能性是盲目地更新与“properties”相关的每个值:
($new | INDEX(.NAME)) as $dict
| walk(if type == "object" and .properties
then .properties |= . + $dict[.NAME]
else . end)这实际上会产生相同的结果。
https://stackoverflow.com/questions/65234659
复制相似问题