好的,所以我有一个我的脚本的缓存文件,它基本上只是一个文件路径列表,但我喜欢保持gzip,因为否则会变得非常庞大。
然而,在我的脚本中我需要逐行阅读它,但是我现在正在通过简单地将整个文件解压缩到/tmp
并使用文件描述符从那里读取它来实现这一点(通过exec
)所以每次我需要下一个条目时我都可以read
。
无论如何,我想知道是否有更有效的方法可以做到这一点;我知道如何通过将gzip
的输出管道化为循环来逐行读取文件,但是我只是定期从缓存文件中读取行,即 - 我已经从不同的数据集循环,所以我也无法从缓存中读取。
是否有任何方法可以直接以逐行方式读取gzip压缩文件的内容(不需要使用read
),而无需先完全展开它,也不使用一个循环?如果可能的话,我会欣赏一个如何以相同的方式编写文件的示例,因为我需要创建/更新缓存文件。
答案 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'脚本中看不到对变量的更改。如果这对您来说是个问题,那么您需要一个更复杂的解决方案来管理缓存文件。