使用jq命令合并两个json文件的字段

时间:2016-04-13 19:36:05

标签: json shell command-line jq

我尝试在shell脚本中使用jq工具(jq-json-processor)来合并两个json字段。

这里是文件的内容:

第一个文件

{ "username": "Bob",
"password": "verytrickipwd",
"windows": 6}

第二个文件(现在问题是我有一个新字段)

{ "username": "",
"password": "",
"windows": 6,
"doors": 
}

我的预期结果

{ "username": "Bob",
"password": "verytrickipwd",
"windows": 6,
"doors": 
}

使用此命令: jq -f file1.json file2.json

2 个答案:

答案 0 :(得分:2)

有几种方法可以“添加”两个JSON对象。在您的特定情况下,以下内容足够:

$ jq --argfile override file1.json '. + $override' file2.json

输出:

{
  "username": "Bob",
  "password": "verytrickipwd",
  "windows": 6,
  "doors": ""
}

如果您的jq不支持--argfile选项,则以下内容应该足够了:

$ jq -s add file2.json file1.json 

请注意,在键名冲突的情况下,第二个文件(本例中为file1.json)的内容优先。

答案 1 :(得分:0)

以下解决方案应该按照您的要求进行,假设您更正了file2.json,以使其有效JSON(“门”缺少值),例如

{
    "username": "",
    "password": "",
    "windows": 6,
    "doors": "doors"
}

并使用-s选项

运行jq
jq -s -f filter.jq file1.json file2.json

其中filter.jq包含下面的过滤器,该过滤器使用 reduce 来合并对象,方法是在第一次遇到键时仅更新键。

reduce .[] as $i (
     {}
   ; reduce ($i|keys[]) as $k (
          .
        ; if .[$k] == null then .[$k] = $i[$k] else . end
     )
)