一尘不染

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

json

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

有没有一种相对简单的方法可以过滤这些对象而无需将整个文件加载到内存中?

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


阅读 311

收藏
2020-07-27

共1个答案

一尘不染

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

2020-07-27