可以直接用jq读取gzip文件吗?

问题描述 投票:0回答:1

我正在使用

jq
读取巨大的 json 文件,例如:

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

这些文件以

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

gzip jq
1个回答
4
投票

如果需要20分钟才能解压,那么无论该库是被

gunzip
使用还是被
jq
使用,解压都会需要20分钟。

但是,您可以避免将解压缩的文件写入磁盘以及与之相关的时间。这可以通过使用以下方法之一来实现:

gunzip -c file.gz | jq -r '[ .a, .b, .time ] | @tsv' >file.tsv
gunzip <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 秒后发出。这通过时间戳反映出来。

© www.soinside.com 2019 - 2024. All rights reserved.