首页 > 解决方案 > 如何在大型 json 文件中获取日期字段的最大值?

问题描述

我有一个大约 500MB 的大型 JSON 文件,它是 URL 调用的响应。我需要使用 shell 脚本(bash)在“结果”数组中的 JSON 文件中获取“日期”字段的最大值。目前使用 jq 作为below.Below 适用于较小的文件,但对于较大的文件,它返回 null。

maxDate=$(cat ${jsonfilePath} | jq '[ .results[]?.date ] | max') 

请帮忙。谢谢!我是 shell 脚本、json、jq 的新手。

样本/输入 json 文件内容:

{
    "results": [
        {
            "Id": "123",
            "date": 1588910400000,
            "col": "test"
        },
        {
            "Id": "1234",
            "date": 1588910412345,
            "col": "test2"
        }
    ],
    "col2": 123
}

标签: jsonbashshellmaxjq

解决方案


给定命令行上的 --stream 选项,JQ 不会将整个输入加载到内存中,而是会逐个读取输入标记,以这种方式生成数组:

[["results",0,"Id"],"123"]
[["results",0,"date"],1588910400000]
...
[["results",1,"date"],1588910412345]
...

由于这个特性,我们可以date从输入中只选择 s 并找出最大值,而不会耗尽内存(以牺牲速度为代价)。例如:

jq -n --stream 'reduce (inputs|select(.[0][-1]=="date" and length==2)[1]) as $d (null; [.,$d]|max)' file

推荐阅读