jq可以直接读取gzip文件吗?
Is it possible to read gzip file directly with jq?
我正在使用 jq
阅读大量 json 文件,例如:
jq -r '[.a, .b, .time] | @tsv' file.txt
这些文件以 gz
文件的形式出现,我每天花 20 分钟来 gunzip
它们。
我想知道是否可以直接从 gz
格式读取带有 jq
的文件?如果是这样,它会整体上更快还是会减慢我的进程?
如果解压需要 20 分钟,那么无论该库供 gunzip
还是供 jq
使用,解压都需要 20 分钟。
但是,您可以避免将解压缩的文件写入磁盘以及与之相关的时间。这将通过使用 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秒后发出。这反映在时间戳上。
我正在使用 jq
阅读大量 json 文件,例如:
jq -r '[.a, .b, .time] | @tsv' file.txt
这些文件以 gz
文件的形式出现,我每天花 20 分钟来 gunzip
它们。
我想知道是否可以直接从 gz
格式读取带有 jq
的文件?如果是这样,它会整体上更快还是会减慢我的进程?
如果解压需要 20 分钟,那么无论该库供 gunzip
还是供 jq
使用,解压都需要 20 分钟。
但是,您可以避免将解压缩的文件写入磁盘以及与之相关的时间。这将通过使用 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秒后发出。这反映在时间戳上。