获取与时间戳相关的文件子集

获取与时间戳相关的文件子集

我有一些字典格式的 json 文件。这些行看起来像这样:

{"a":"1", "b":"2", "c":"3", "time":1334572551435}
{"a":"1", "b":"2", "c":"4", "time":1334575352456}
{"a":"2", "b":"2", "c":"7", "time":1334575335345}
...

时间采用 UTC 格式。整个文件有大约 3 亿个独特的行(无论如何,同一时间可能会出现两次)。我如何为某个特定时间选择线路,例如1334575352456和之间1334575353456

我个人从一些教程中得到了下一个想法:

awk ’$"time" == 1334575352456, $"time" == 1334575353456’ inputfile.json

不管怎样,我想这个解决方案是针对列的"time",而不是针对带有键的字典的"time"(实际上$"time"应该是$4

答案1

尝试:

$ awk -F'[:}]' '$(NF-1) >= 1334575352456 && $(NF-1) <= 1334575353456' file
{"a":"1", "b":"2", "c":"4", "time":1334575352456}

-F'[:}]'设置字段分隔符为:},因此您可以使用 访问倒数第二个字段来访问时间值$(NF-1)

要保存输出,请使用:

$ awk -F'[:}]' '$(NF-1) >= 1334575352456 && $(NF-1) <= 1334575353456' file > output.txt

如果您有gawk 4.1.0以上条件,您可以使用-i选项进行就地编辑:

$ awk -i inplace -F'[:}]' '$(NF-1) >= 1334575352456 && $(NF-1) <= 1334575353456' file

答案2

由于输入是一组 JSON 对象,因此使用 JSON 感知工具是有意义的。

使用jqJSON 处理器仅提取值time严格介于某些值t0t1时间值之间的条目(-c此处使用的选项选择“紧凑”输出):

jq -c --argjson t0 1334572551435 --argjson t1 1334575352456 \
    'select(.time > $t0 and .time < $t1)' file

与 Miller ( ) 等效的命令mlr,尽管没有参数化时间范围的开始和结束:

mlr --json filter '$time > 1334572551435 && $time < 1334575352456' file

相关内容