如何逐行读取gz文件TCL / LINUX

时间:2018-11-22 15:27:59

标签: linux tcl

我在TCL中制作了一个脚本,该脚本接收巨大的输入文件,逐行读取然后以某种方式修改数据。

当我需要对包含数据文件的* .gz格式文件执行相同操作时,问题就开始了。

我在Google搜索中发现的唯一一件事是如何使用gzcat进行操作,而且也没有用+不好,因为它读取了整个文件(我认为是),并且我不希望它处理整个文件。

简而言之:我需要逐行读取gz文件,我该怎么做? 我在正常情况下所做的示例:

trait

我尝试过并无法理解的方式\使其对我有用:

set fh [open <some path> r]
while {[gets $fh line]>=0} {
do something with $line
}

谢谢!

1 个答案:

答案 0 :(得分:2)

如果您拥有Tcl 8.6,请执行以下操作:

set fh [open <SomePath.gz> r]
zlib push gunzip $fh
while {[gets $fh line]>=0} {
    do something with $line
}
close $fh

在8.5或更低版本中,通过外部gzcat进程是最简单的方法。

set ZCAT_PROGRAM gzcat;   # Might be called something else on your system

set fh [open |[list $ZCAT_PROGRAM <SomePath.gz>] r]
while {[gets $fh line]>=0} {
    do something with $line
}
close $fh

如果传递正确的标志,如果您有gzip,也可以执行此操作,这具有以下优点:当它完全存在时,它被称为gzip

set fh [open |[list gzip -d -c <SomePath.gz>] r]
while {[gets $fh line]>=0} {
    do something with $line
}
close $fh

-d选项会进行解压缩,-c选项会将其发送到stdout,以便我们可以从管道中读取它。)