如何使用jq或任何工具合并目录中的多个json文件?

Jon*_* Ma 5 json jq

我正在尝试合并一个目录中的所有 json 文件(可以有很多)。

我知道如果只有 2 个文件,我可以使用jq -s . file1.json file2.json. 但是当我尝试使用像这样的通配符时jq -s . file*.json,它失败了。任何想法?

log*_*sex 9

尝试这个:

jq -s add *.json > merged.json
Run Code Online (Sandbox Code Playgroud)


Dmi*_*try 0

在等待 jq 的解决方案时,让我解决这个问题“......或任何工具?”

不同的人通过“合并”意味着不同的事情,因此假设这里是一个简单的递归 JSON 合并,那么使用jtc(另一个工具)解决方案将是这样的(对于任意数量的文件):

  • 将所有 JSON 读入一个超级 JSON 数组
  • 将其余读取的 JSON 合并到第一个子级(第一个读取的 JSON)
  • 输出数组中生成的第一个 JSON 子项
jtc -J / -w[0] -mi[1:] / -w[0] *.json 
Run Code Online (Sandbox Code Playgroud)

为了说明该解决方案,以下是它如何处理几个任意 JSON 文件:

bash $ jtc -tc file1.json 
{
   "days": {
      "2020-05-18": { "seconds": 60 },
      "2020-05-19": { "seconds": 30 },
      "2020-05-20": { "seconds": 1400 }
   },
   "total": { "seconds": 1490 }
}
bash $ jtc -tc file2.json 
{
   "days": {
      "2020-05-20": { "seconds": 95 },
      "2020-05-21": { "seconds": 80 },
      "2020-05-22": { "seconds": 120 }
   },
   "total": { "seconds": 295 }
}
bash $ jtc -J / -w[0] -mi[1:] / -w[0] -tc file*.json
{
   "days": {
      "2020-05-18": { "seconds": 60 },
      "2020-05-19": { "seconds": 30 },
      "2020-05-20": {
         "seconds": [ 1400, 95 ]
      },
      "2020-05-21": { "seconds": 80 },
      "2020-05-22": { "seconds": 120 }
   },
   "total": {
      "seconds": [ 1490, 295 ]
   }
}
bash $ 
Run Code Online (Sandbox Code Playgroud)

-tcflag 仅用于在此处以紧凑格式显示 JSON

附言。碰巧我是jtc工具 - unix JSON 处理实用程序的创建者。