json - 使用 bash 脚本合并 JSON 文件

标签 json bash awk

我是 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

它有效,但我觉得有更好的方法来做到这一点。有什么想法吗?

最佳答案

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

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

对于任意多的文件,使用 reduce 将其按顺序应用于所有文件:

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

-s 开关使 jq 在处理它们之前将 JSON 文件的内容读取到一个大数组中。

关于json - 使用 bash 脚本合并 JSON 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29636331/

相关文章:

linux - 从终端短暂运行/重启 sublime text

regex - gawk 正则表达式没有按预期工作

c# - C# 中的 JSON;发送和接收数据

bash - 行尾的 ANSI 转义代码奇怪行为

ruby-on-rails - 以 rails 形式存储和检索 postgres 嵌套的 JSONB 数据类型

bash - 等待退出所有子进程退出

linux - 使用 -c 和 awk 的管道字符串调用 bash 命令

bash - 带有双引号输入行的多行 CSV : output on a single line,,使用不同的分隔符

javascript - 无法从 Web 服务器恢复 json 响应

javascript - Javascript 中的 JSON 字符串解析