在阶段中处理压缩文件

时间:2014-01-23 16:20:47

标签: shell gzip

好的,所以我有一个我的脚本的缓存文件,它基本上只是一个文件路径列表,但我喜欢保持gzip,因为否则会变得非常庞大。

然而,在我的脚本中我需要逐行阅读它,但是我现在正在通过简单地将整个文件解压缩到/tmp并使用文件描述符从那里读取它来实现这一点(通过exec)所以每次我需要下一个条目时我都可以read

无论如何,我想知道是否有更有效的方法可以做到这一点;我知道如何通过将gzip的输出管道化为循环来逐行读取文件,但是我只是定期从缓存文件中读取行,即 - 我已经从不同的数据集循环,所以我也无法从缓存中读取。

是否有任何方法可以直接以逐行方式读取gzip压缩文件的内容(不需要使用read),而无需先完全展开它,也不使用一个循环?如果可能的话,我会欣赏一个如何以相同的方式编写文件的示例,因为我需要创建/更新缓存文件。

2 个答案:

答案 0 :(得分:2)

如果您不希望从压缩文件中读取影响从其他文件读取的内容,或者您​​希望从其中读取的时间与其他逻辑相关是不规则的,我会建议这些内容。流速:

exec 3< <(zcat compressedfile.gz)

while read other stuff from other file
do

  # ...

  if ${sometimes}
    read -u3 get stuff from compressed file

  # ...

done < other_file

exec 3<&-

答案 1 :(得分:0)

zcat是您阅读文件所需要的,因为它是纯文本。完整的shell代码可能如下所示: zcat <file> | while read line; do.....; done但要注意子shell问题:while在子shell中执行,因此在'main'脚本中看不到对变量的更改。如果这对您来说是个问题,那么您需要一个更复杂的解决方案来管理缓存文件。