【问题标题】:How to filter JSON using jq stream [duplicate]如何使用 jq 流过滤 JSON [重复]
【发布时间】: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"}}

非常感谢任何帮助/指导!

【问题讨论】:

    标签: json jq


    【解决方案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")))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 2022-11-15
    • 2017-08-02
    相关资源
    最近更新 更多