jq使用流来解析> 20 gb的json文件

时间:2020-03-03 17:03:56

标签: json stream jq

我有一个json文件,其数据量> 20 gb,如下所示:

{
  "_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流的方法(我已经安装了1.6版)来获取内容中包含4 ..元素的所有001值(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")'

1 个答案:

答案 0 :(得分:0)

由于您的输入已经是流,因此无需使用--stream选项。以下将产生所需的输出:

< input.json jq -r '.content
| fromjson
| select( any(keys_unsorted[]; test("^4")) )
| .["001"]'