使用 jq 处理巨大的 json-array 文件

Processing huge json-array files with jq

我有巨大的 (~7GB) json 数组相对较小的对象。

是否有相对简单的方法来过滤这些对象而无需将整个文件加载到内存中?

--stream 选项看起来很合适,但我不知道如何将 [path,value] 的流折叠到原始对象。

jq 1.5 有一个流解析器。 jq FAQ 给出了如何将 JSON 对象的顶级数组转换为其元素流的示例:

$ jq -nc --stream 'fromstream(1|truncate_stream(inputs))'
[{"foo":"bar"},{"foo":"baz"}]
{"foo":"bar"}
{"foo":"baz"}

这可能足以满足您的目的,但值得注意的是 setpath/2 可能会有所帮助。以下是制作传单流的方法:

jq -c --stream '. as $in | select(length == 2) | {}|setpath($in[0]; $in[1])'

jq 手册中提供了更多信息和文档: https://stedolan.github.io/jq/manual/#Streaming