使用Bash脚本合并JSON文件

29

我对bash脚本编写非常陌生。我试图编写一个将多个JSON文件合并的脚本。例如:

文件1:

{
  "file1": {
     "foo": "bar"
  }
}

文件2:

{
  "file1": {
     "lorem": "ipsum"
  }
}

合并后的文件:

{
  "file1": {
    "foo": "bar"
  },
  "file2": {
    "lorem": "ipsum"
  }
}

这是我想到的:

awk 'BEGIN{print "{"} FNR > 1 && last_file == FILENAME {print line} FNR == 1 {line = ""} FNR==1 && FNR != NR {printf ","} FNR > 1 {line = $0} {last_file = FILENAME} END{print "}"}' json_files/* > json_files/all_merged.json

它能用,但我感觉有更好的方法。你有什么想法吗?


我假设文件2的键应该是"file2" - glenn jackman
确实。错过了那个!谢谢! - heena
1个回答

52

使用 awk 处理 JSON 并不是一个好的选择,因为无意义空格的任意更改都会破坏您的代码。相反,请使用 jq;它就是为这种情况而设计的。要合并两个对象,请使用 * 运算符,即对于两个文件:

jq -s '.[0] * .[1]' file1.json file2.json

对于任意数量的文件,请使用 reduce 依次将其应用于所有文件:

jq -s 'reduce .[] as $item ({}; . * $item)' json_files/*

-s 开关使得 jq 在处理 JSON 文件之前将其内容读入一个大数组中。


1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Wintermute
谢谢大家!我之前不知道 jq。 - heena
11
这似乎并没有像我希望的那样合并数组。如果两个文件都有同名的数组,输出结果最终只包含最后一个文件中该数组的元素。 - AC.
您可以使用以下命令将一个 JSON 字面量与文件合并:jq '. * $p' file.json --argjson p '{"foo": "bar"}' - z0r
这个解决方案是否会深度合并具有相同名称的对象,还是只执行浅层合并? - Muhammad Qasim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接