arrays - 如何使用 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
........
........
这里没有数组括号,每个对象都用换行符分隔。我想将它转换为原始结构,数组由逗号分隔的对象组成而不影响内存
任何帮助表示赞赏
解决方案
在输出数组足够小以适合内存的情况下(与此特定问题的细节相反),可能会感兴趣以下响应。
一种选择是将 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 ]'
推荐阅读
- c# - CsvHelper Configuration.ShouldQuote - 仅对 DTO 上的字符串字段返回 true
- visual-studio - 比较 .cs 文件时忽略格式更改
- sql - 在sql查询中合并行
- android - NavigationView 自定义菜单项
- typo3 - TCA/后端并排定位字段
- html - Windows XP 中的批处理 HTA 混合脚本错误
- apache-beam - 如何在 Apache Beam 中实现没有重叠的训练测试分割?
- c - 跳出内联汇编到 AVR32 上的错误目标
- python - 如何在 2 个列表 python 3 之间提取列表?
- android - 错误 0xfffffc03:MediaCodec OMX.sprd.h264.encoder 上的 android.media.MediaCodec.error_neg_1021