使用bash脚本合并JSON文件

hee*_*ena 10 bash awk json

我是新手来编写脚本.我试图编写一个合并多个json文件的脚本.例如:

档案1:

{
  "file1": {
     "foo": "bar"
  }
}
Run Code Online (Sandbox Code Playgroud)

文件2:

{
  "file1": {
     "lorem": "ipsum"
  }
}
Run Code Online (Sandbox Code Playgroud)

合并文件:

{
  "file1": {
    "foo": "bar"
  },
  "file2": {
    "lorem": "ipsum"
  }
}
Run Code Online (Sandbox Code Playgroud)

这就是我想出的:

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
Run Code Online (Sandbox Code Playgroud)

它有效,但我觉得有更好的方法.有任何想法吗?

Win*_*ute 22

使用awk处理JSON并不是一个非常好的主意.无意义的空白中的任意更改将破坏您的代码.相反,使用jq; 这是为了这种事情.要组合两个对象,请使用*运算符,即两个文件:

jq -s '.[0] * .[1]' file1.json file2.json
Run Code Online (Sandbox Code Playgroud)

对于任意多个文件,使用reduce顺序应用于所有文件:

jq -s 'reduce .[] as $item ({}; . * $item)' json_files/*
Run Code Online (Sandbox Code Playgroud)

在处理JSON文件之前,-s交换机jq会将JSON文件的内容读入大型数组.

  • 对于`jq`版本1.3,`+`代替`*` (3认同)
  • 这似乎并没有像我希望的那样合并数组。如果两个文件都具有相同名称的数组,则输出将以最后一个文件中数组中的元素结尾 (2认同)