jq使用流解析json文件>;20GB

jq使用流解析json文件>;20GB,json,stream,jq,Json,Stream,Jq,我有一个json文件,其数据大于20GB,如下所示: { "_id": { "$serialnumber": "572" }, "content": "{\"001\":\"77\",\"401\":[[\" 0\",[\"a\",\"UK\"],[\"b\",\"Euy/ O\"],[\"c\",\"20160811\"],[\"g\",\"R2\"]],[\" 1\",[\"a\",\"UK\"],[\"b\",\"LO\"],[\"c\",\"20160811\"]]]

我有一个json文件,其数据大于20GB,如下所示:

{
  "_id": {
    "$serialnumber": "572"
  },
  "content": "{\"001\":\"77\",\"401\":[[\" 0\",[\"a\",\"UK\"],[\"b\",\"Euy/ O\"],[\"c\",\"20160811\"],[\"g\",\"R2\"]],[\" 1\",[\"a\",\"UK\"],[\"b\",\"LO\"],[\"c\",\"20160811\"]]]}"
}
{
  "_id": {
    "$serialnumber": "573"
  },
  "content": "{\"001\":\"234\",\"424\":[[\" 0\",[\"a\",\"UK\"],[\"b\",\"Euy/ O\"],[\"c\",\"20160811\"],[\"g\",\"R2\"]],[\" 1\",[\"a\",\"UK\"],[\"b\",\"LO\"],[\"c\",\"20160811\"]]]}"
}
{
  "_id": {
    "$serialnumber": "574"
  },
  "content": "{\"001\":\"549\",\"432\":[[\" 0\",[\"a\",\"UK\"],[\"b\",\"Euy/ O\"],[\"c\",\"20160811\"],[\"g\",\"R2\"]],[\" 1\",[\"a\",\"UK\"],[\"b\",\"LO\"],[\"c\",\"20160811\"]]]}"
}
{
  "_id": {
    "$serialnumber": "575"
  },
  "content": "{\"001\":\"888\",\"532\":[[\" 0\",[\"a\",\"UK\"],[\"b\",\"Euy/ O\"],[\"c\",\"20160811\"],[\"g\",\"R2\"]],[\" 1\",[\"a\",\"UK\"],[\"b\",\"LO\"],[\"c\",\"20160811\"]]]}"
}
我需要一种使用jq stream的方法(我已经安装了1.6版)来获取所有001个值,这些值在内容中有一个4。。元素。(400,或401,或402,或403,…)

例如,上述内容将返回:

77
234
549
而不是888,它不包含任何4。。元素

001 77 has the \"401\" element
001 234 has the \"424\" element
001 549 has the \"432\" element
下面请找到我解决此问题的一个尝试:

jq -cn --stream 'fromstream(1|truncate_stream(inputs | select(.[0][] == "_id") | del(.[0][0]))) | select(.content == "400")'

因为您的输入已经是一个流,所以不需要使用--stream选项。以下操作产生所需的输出:

< input.json jq -r '.content
| fromjson
| select( any(keys_unsorted[]; test("^4")) )
| .["001"]'
由于您的输入已经是一个流,因此不需要使用--stream选项。以下操作产生所需的输出:

< input.json jq -r '.content
| fromjson
| select( any(keys_unsorted[]; test("^4")) )
| .["001"]'
为什么要使用
--stream
?你看到没有它的错误了吗?我使用stream选项,因为我有一个超过20G的json文件,但是你的输入似乎是一个对象流本身。我认为这样的输入不应该导致内存错误,是不是我错了?请举例说明我应该如何更改jq命令,以避免出错,因为即使没有stream选项,如果您的输入不是数组而是问题中所示的流,
.content | fromjson | select(键[1]),我也不会得到有效的结果|使用(“4”))“001”
应该可以使用。为什么使用
--stream
?你看到没有它的错误了吗?我使用stream选项,因为我有一个超过20G的json文件,但是你的输入似乎是一个对象流本身。我认为这样的输入不应该导致内存错误,是不是我错了?请举例说明我应该如何更改jq命令,以避免出错,因为即使没有stream选项,如果您的输入不是数组而是问题中所示的流,
.content | fromjson | select(键[1]),我也不会得到有效的结果|使用“4”)启动。“001”
应在imo中起作用