首页 > 解决方案 > 是否可以直接用 jq 读取 gzip 文件?

问题描述

我正在阅读巨大的 json 文件jq,例如:

jq -r '[.a, .b, .time] | @tsv' file.txt

这些文件以文件的形式出现gz,我每天花 20 分钟来处理gunzip它们。我想知道是否可以jq直接从gz格式中读取文件?如果是这样,总体上会更快还是会减慢我的进程?

标签: gzipjq

解决方案


如果解压需要 20 分钟,那么无论库是被使用gunzip还是被jq.

但是,您可以避免将解压缩的文件写入磁盘以及与此相关的时间。这将通过使用gunzip -c.

gunzip -c file.gz | jq -r '[ .a, .b, .time ] | @tsv' >file.tsv

需要明确的是,以上使用最少的内存。任何时候都无法在内存中完整地找到这三个文件(压缩、解压缩或 TSV)中的任何一个。

以下演示了 的流式传输性质jq

$ (
   j='{"a": "a", "b": "a", "time": "20210210T10:10:00"}'
   printf '%s\n' "$j"
   printf '%s\n' "$j"
   sleep 4
   printf '%s\n' "$j"
) | jq -r '[ .a, .b, .time, now ] | @tsv'
a       a       20210210T10:10:00       1620305187.460741
a       a       20210210T10:10:00       1620305187.460791
[4 second pause]
a       a       20210210T10:10:00       1620305191.459734

前两条记录立即发出,第三条在 4 秒后发出。这反映在时间戳上。


推荐阅读