如何使用 jq 流过滤 JSON [重复]
Posted
技术标签:
【中文标题】如何使用 jq 流过滤 JSON [重复]【英文标题】:How to filter JSON using jq stream [duplicate] 【发布时间】:2018-09-14 03:17:58 【问题描述】:我有一个非常大的 JSON 文件,示例数据如下所示:
"userActivities":"L3ATRosRdbDgSmX75Z":"deviceId":"60ee32c2fae8dcf0","dow":"Friday","localDate":"2018-01-19","L3ATSFGrpAYRkIIKqrh":"deviceId":"60ee32c2fae8dcf0","dow":"Friday","localDate":"2018-01-20"
我需要在 jq 流中的“localDate”字段上放置一个过滤器,以便输出看起来像以下 JSON:
"L3ATSFGrpAYRkIIKqrh":"deviceId":"60ee32c2fae8dcf0","dow":"Friday","localDate":"2018-01-19"
非常感谢任何帮助/指导!
【问题讨论】:
【参考方案1】:在根据值进行选择时保留键值对的最简单方法是使用with_entries
:
jq '.userActivities
| with_entries(select(.value.localDate=="2018-01-20"))' input.json
输出
"L3ATSFGrpAYRkIIKqrh":
"deviceId": "60ee32c2fae8dcf0",
"dow": "Friday",
"localDate": "2018-01-20"
【讨论】:
我正在处理大约 20 GB 的非常大的 JSON,因此正在寻找使用 jq 流的解决方案 问题明确说明答案需要使用--stream
。
@tilde - 最初的问题没有指定--stream
,但确实提到了流媒体。在 jq 的上下文中,所谓的“流解析器”(由 --stream 命令行选项启用)和 JSON 文本的“流”之间存在区别。最初的问题提到了一个大文件,没有说明它是单个 JSON 文本还是 JSON 文本流。如果是后者,那么使用流解析器很可能太慢了。【参考方案2】:
jq -cn --stream 'fromstream(1|truncate_stream(inputs | select(.[0][] == "userActivities"))) | with_entries(select(.value.localDate=="2018-01-19")) ' input.json
输出:
"L3ATRosRdbDgSmX75Z":"deviceId":"60ee32c2fae8dcf0","dow":"Friday","localDate":"2018-01-19"
【讨论】:
非常感谢,它有效。只是想检查是否有可用的选项,其中过滤器可以放在同一变量的多个值上。例如:localDate in ("2018-01-19", "2018-01-20")? 是的。但语法是这样的:jq -cn --stream 'fromstream(1|truncate_stream(inputs | select(.[0][] == "userActivities"))) | with_entries(select(.value.localDate == ("2018-01-19") or .value.localDate == ("2018-01-20")))
以上是关于如何使用 jq 流过滤 JSON [重复]的主要内容,如果未能解决你的问题,请参考以下文章
django-rest-framework框架总结之认证权限限流过滤分页及异常处理