Shell 分阶段处理压缩文件

Shell 分阶段处理压缩文件,shell,gzip,Shell,Gzip,好的,我为我的一个脚本准备了一个缓存文件,它基本上只是一个文件路径列表,但我喜欢将其压缩,否则它会变得非常巨大 然而,在我的脚本中,我需要逐行读取它,然而,我目前只需将整个文件解压缩为/tmp,然后使用文件描述符(通过exec)从中读取,这样每次需要下一个条目时,我就可以从中读取 不管怎样,我想知道是否有一种更有效的方法,我可以这样做;我知道如何通过管道将gzip的输出放入循环中逐行读取文件,但是我只定期从缓存文件中读取行,也就是说,我已经在从不同的数据集进行循环,因此我也无法以这种方式从缓存中

好的,我为我的一个脚本准备了一个缓存文件,它基本上只是一个文件路径列表,但我喜欢将其压缩,否则它会变得非常巨大

然而,在我的脚本中,我需要逐行读取它,然而,我目前只需将整个文件解压缩为
/tmp
,然后使用文件描述符(通过
exec
)从中读取,这样每次需要下一个条目时,我就可以
从中读取

不管怎样,我想知道是否有一种更有效的方法,我可以这样做;我知道如何通过管道将
gzip
的输出放入循环中逐行读取文件,但是我只定期从缓存文件中读取行,也就是说,我已经在从不同的数据集进行循环,因此我也无法以这种方式从缓存中读取


有没有什么方法可以让我不用先完全展开Gzip文件,也不用使用循环,就可以逐行直接读取Gzip文件的内容(不需要使用
read
)?如果可能的话,我希望能举一个例子,说明如何以同样的方式编写文件,例如当我需要创建/更新缓存文件时。

zcat
是您读取纯文本文件所需要的。完整的shell代码可能如下所示:
zcat |读取行时;做完成
但要注意子shell问题:
在子shell中执行,因此在“主”脚本中看不到对变量的更改。如果这对您来说是一个问题,那么您需要一个更复杂的解决方案来处理缓存文件

如果您不希望从压缩文件中读取内容会影响从其他文件中读取内容,或者如果您希望从压缩文件中读取内容的时间相对于逻辑流的其余部分来说是不规则的,我建议您遵循以下原则:

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<&-

exec 3<这似乎做得很好!我不确定我是否可以在我的平台上使用
read-u3
,但是
read-line如果你正在运行一个足够新的
bash
来摸索
exec 3<,好吧,是的,虽然这个功能在我的Linux测试盒上可用,但我不确定OS X是否支持它(至少Mountain Lion似乎不支持),还有其他选择吗?那么写作呢?我对OS X不是特别熟悉,但我建议1)确保你真的在使用
bash
而不是伪装成它的东西,2)旧版本的
bash
仍然有协进程,我相信,它的功能类似于进程替换,但是要正确地编写代码有点困难-检查手册页以了解您的版本,3)如果您没有真正使用
bash
请检查相应的手册页以了解您的shell实际具有哪些功能,3)可能安装额外的包件以获得更新的shell版本…关于您的写作问题,如果您使用的shell支持
(…)
。有关更多信息,请阅读手册页面中有关流程替换的部分。