使用jq来合并JSON文件夹

5
我有一个包含约100个JSON文件的目录,每个文件都是100个简单记录的数组。我想将它们合并为一个文件,并将其包含为应用程序中的静态数据,这样就不必反复调用API以检索小块数据。(我限制了一次仅能下载100条记录;这就是为什么我有100个短文件的原因。)
以下是一个示例文件,缩短为两条记录以在此显示:
[
 {
   "id": 11531,
   "title": "category 1",
   "count": 5
 },
 {
   "id": 11532,
   "title": "category 2",
   "count": 5
 }
]

我的研究得出了一个解决方案,但只适用于每个文件有两条记录的两个文件:

jq -s '.[0] + .[1]' file1.json file2.json > output.json

这个源码还建议使用以下代码来处理一个目录(当前目录中只有两个文件):

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

但我收到一个错误:

jq: error (at json_files/categories-11-20.json:0): object ({}) and array ([{"id":1153...) cannot be multiplied

我原以为问题可能是*在尝试乘法,所以我试着替换成+,但是出现了...无法相加的信息。

是否有通过jq实现这个功能的方法,或者有更好的工具可供使用?


你的两个文件解决方案也不起作用,你是不是想说 .[0] + .[1]?你能提供一下你想要输出的样本吗?(比如,你是否想要一个由各个数组中所有记录组成的单个数组?) - chepner
如果 .[0] + .[1] 能够满足你的需求,那么一般化的方法是 jq -s add json_files/* > output.json - chepner
@chepner 您是正确的。是我打错了字。它可以使用 + 运算符。我已经在上面进行了修正。 - tangobango
1个回答

6

最简单和完全合理的方法是使用-s命令行选项,并按以下方式添加add

jq -s add json_files/* 

当然,您可能希望以不同的方式指定文件列表。它们被指定的顺序也很重要。
注:
- 此问题实际上只是 使用 jq 合并多个文件中的 JSON 数组 的变体。 - `reduce` 也可以使用,但是您需要从 `null` 或 `[]` 开始,而不是 `{}`。 - 运算符 `*`(不出所料)与 `+` 很不一样!

运行得非常好。谢谢。作为 jq 的新手,我没有看到链接中的答案如何适用于我,因为我没有提取任何部分。我应该多尝试一下。顺便说一下,如果我的文件名是 cat1、cat2 等,我该如何指定顺序? - tangobango
1
底层发生的事情是,-s 标志创建一个数组(一个文件 -> 一个项目)的数组(一条记录 -> 一个项目)。而 add 连接外部项目。要指定顺序,您需要按正确顺序管道传入文件,例如使用 bash 循环,迭代 cat“cat$i”(第一个 cat 是 bash 连接符,第二个是您的文件名子字符串)。 - Cornelius Roemer
1
@tangobango 这应该可以按顺序完成任务:for i in {1..100}; do cat "cat$i"; done | jq -s add - Cornelius Roemer

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