Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSON/JQ:根据条件合并键值上的2个文件_Json_Bash_Shell_Merge_Jq - Fatal编程技术网

JSON/JQ:根据条件合并键值上的2个文件

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"

我有2个JSON文件。我想使用jq从文件2中获取capital的值,并将其与文件1合并,以获得出现相同名称-值对的每个元素。否则,文件2中的元素不应出现在输出中。如果文件1中的元素没有名称-值对,则其大写字母应为空文本

文件1:

{
   "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如果它能满足我的需要,我很乐意使用它。欢迎使用堆栈溢出!您似乎在要求某人为您编写一些代码。堆栈溢出是一个问答网站,而不是代码编写服务。请学习如何写有效的问题。