json - 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")'
解决方案
由于您的输入已经是流,因此无需使用 --stream 选项。以下产生所需的输出:
< input.json jq -r '.content
| fromjson
| select( any(keys_unsorted[]; test("^4")) )
| .["001"]'
推荐阅读
- angular - 子级更改其双向绑定属性后的父级属性更改检测
- angular - nativescript中滚动时的粘性标题
- reactjs - 将反应表单状态发布到后端 - 使用 nodemailer
- linux - linux shell中的无效别名
- kubernetes - 使用 kubernetes 和 minikube 运行 db:create 的最佳实践
- microsoft-graph-api - Microsoft Graph findMeetingTimes - 401 UnknownError
- python - 用另一个列表中的值替换列表中的特定值
- openssl - 使用 OpenSSL 1.1.x,如何在调用 sk_X509_EXTENSION_pop_free() 等函数后指示释放 STACK_OF(X509_EXTENSION) 项?
- c++ - c++ 和 simulink 通过 udp 进行通信
- javascript - a.nodeName.toLowerCase 不是函数