JSON/JQ:根据条件合并键值上的2个文件
我有2个JSON文件。我想使用jq从文件2中获取capital的值,并将其与文件1合并,以获得出现相同名称-值对的每个元素。否则,文件2中的元素不应出现在输出中。如果文件1中的元素没有名称-值对,则其大写字母应为空文本 文件1:JSON/JQ:根据条件合并键值上的2个文件,json,bash,shell,merge,jq,Json,Bash,Shell,Merge,Jq,我有2个JSON文件。我想使用jq从文件2中获取capital的值,并将其与文件1合并,以获得出现相同名称-值对的每个元素。否则,文件2中的元素不应出现在输出中。如果文件1中的元素没有名称-值对,则其大写字母应为空文本 文件1: { "countries":[ { "name":"china", "continent":"asia"
{
"countries":[
{
"name":"china",
"continent":"asia"
},
{
"name":"france",
"continent":"europe"
}
]
}
文件2:
{
"countries":[
{
"name":"china",
"capital":"beijing"
},
{
"name":"argentina",
"capital":"buenos aires"
}
]
}
预期结果:
{
"countries":[
{
"name":"china",
"continent":"asia",
"capital":"beijing"
},
{
"name":"france",
"continent":"europe",
"capital":""
}
]
}
单向:
$jq-slurpfile file2 file2.json'
{国家:
[.国家[]|
.美元|
$curr+{capital:$file2[0]。国家[]选择.name==$curr.name |.capital/}
]
}'file1.json
{
国家:[
{
名称:中国,
大陆:亚洲,
首都:北京
},
{
姓名:法国,
欧洲大陆,
首都:
}
]
}
另一种选择:
$jq-n'{国家:[输入]| map.countries | flatten | group|u by.name|
地图选择。[]| HasContinental | add |.capital/=
}'文件[12].json
您可以首先从文件2构建字典,然后执行更新,例如:
jq --argfile dict File2.json '
($dict.countries | map( {(.name): .capital}) | add) as $capitals
| .countries |= map( .capital = ($capitals[.name] // ""))
' File2.json
从JSON风格的角度来看,对于缺少的值,最好使用null;在这种情况下,您可以通过省略//来简化上述内容
使用索引/2
如果jq有INDEX/2,则可以使用以下表达式构造$capitals字典:
INDEX($dict.countries[]; .name) | map_values(.capital)
使用索引可以使意图更加清晰,但如果效率是主要考虑因素,那么最好明确使用reduce:
reduce $dict.countries[] as $c ({}; . + ($c | {(.name): .capital}))
你真的不想在这里使用flant或group_by,尤其是group_by,因为它的实现涉及排序。@peak如果它能满足我的需要,我很乐意使用它。欢迎使用堆栈溢出!您似乎在要求某人为您编写一些代码。堆栈溢出是一个问答网站,而不是代码编写服务。请学习如何写有效的问题。