首页 > 解决方案 > jq 使用流解析 json 文件 > 20 gb

问题描述

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

{
  "_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 版)来获取内容中包含的所有 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")'

标签: jsonstreamjq

解决方案


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

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

推荐阅读