首页 > 解决方案 > 如何使用 jq 流处理大型对象数组并转换为对象数组

问题描述

我有一个 24 GB 的大文件,其中包含 22M JSON 对象的数组。我必须对每个 JSON 对象进行一些操作并写入另一个文件。我正在使用以下命令

jq -cn --stream 'fromstream(1|truncate_stream(inputs))' test.json \
| jq -c ' if has ("middleName") then .sortableMiddleName=.middleName else . end | if has("middleName") then .middleName=[.middleName] else . end' \
> test_new.json

该命令没有任何问题,但输出包含由换行符分隔的 JSON 对象,并且没有父数组。例如,最初,文件的结构如下

[

object 1,
object 2,
........,
.........

]

处理完文件后,输出文件的结构如下。

object 1

object 2

........

........

这里没有数组括号,每个对象都用换行符分隔。我想将它转换为原始结构,数组由逗号分隔的对象组成而不影响内存

任何帮助表示赞赏

标签: arraysjsonlinuxstreamjq

解决方案


在输出数组足够小以适合内存的情况下(与此特定问题的细节相反),可能会感兴趣以下响应。

一种选择是将 jq 的第二次调用更改为这种形式:

jq -nc '[inputs | .... ]'

这里的 -n 选项与 一起使用inputs,外部方括号将所有内容放入数组中。

另一种可能性,同样基于上述假设,可能是将两个对 jq 的调用合并为一个:

< data.json jq -cn --stream '
  [fromstream(1|truncate_stream(inputs))
   | if has ("middleName") then .sortableMiddleName=.middleName 
     else . end
     | if has("middleName") then .middleName=[.middleName] 
       else . end ]'


推荐阅读