【发布时间】:2020-06-16 03:05:35
【问题描述】:
我有一个 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 版)来获取内容中包含的所有 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?如果没有它,您会看到错误吗? -
我使用流选项,因为我有一个超过 20 GB 大小的 json 文件
-
是的,但您的输入似乎是对象本身的流。我认为这样的输入不应该导致内存错误,我错了吗?
-
能否请您详细说明我应该如何更改 jq 命令以免出错,因为即使没有流选项我也没有得到有效结果
-
就像,如果您的输入不是数组而是问题中显示的流,
.content|fromjson|select(keys[1]|startswith("4")) ."001"应该可以工作 imo