能否使用jq直接读取gzip格式文件?直接读取的处理效率会受影响吗?
关于jq读取gzip压缩JSON文件的问题解答
能否用jq直接读取gz格式文件
原生jq本身不支持直接解析gzip压缩的文件,但是你不需要提前单独执行gunzip解压出完整文件,可以通过管道把解压流直接传给jq处理,等效于直接处理gz文件,不需要额外生成中间解压文件。
适配你的场景的命令示例如下:gunzip -c file.txt.gz | jq -r '[.a, .b, .time] | @tsv'
其中gunzip -c参数会将解压后的内容输出到标准输出,不会在磁盘生成解压后的实体文件。
处理速度对比
和你当前「先单独执行gunzip解压存盘,再运行jq读取解压后文件」的流程相比,上述管道流式处理的速度明显更快:
- 原流程的IO链路:读取gz文件 → 写入全量解压后文件到磁盘 → 读取磁盘上的解压后文件送入jq处理,多了两次大文件磁盘IO操作,你之前花费的20分钟解压时间大部分消耗在解压后文件的写入IO上
- 管道流式处理的IO链路:读取gz文件 → 解压后的内容直接在内存中传输给jq处理,无中间文件的磁盘读写开销,整体耗时仅为解压耗时+jq处理耗时,可省掉原流程中单独解压等待的大部分时间。
内容的提问来源于stack exchange,提问作者Nir。
相关产品推荐
相关产品推荐

