在 Linux 中使用 zcat 和 gzip

在 Linux 中使用 zcat 和 gzip

我使用zcatgzip来合并和压缩文件:

zcat file1.fastq.gz file2.fastq.gz | gzip -c > file1.fastq.gz

现在,我有 0 个字节file1.fastq.gz

请指教?

答案1

当您使用>重定向时,shell 将打开命名文件(file1.fastq.gz)进行写入并将其截断为零长度。(文档

接下来,zcat将运行,以file1.fastq.gzfile2.fastq.gz作为输入文件。

此时,zcat会引发错误,因为输入文件(file1.fastq.gz)没有内容 - 甚至没有 GZip 标头 - 并且管道崩溃。

您可能会发现它的file1.fastq.gz大小实际上只有几个字节(而不是零),这是由于gzip压缩并写入其空输入造成的。

$ echo "foo" | gzip > file1.gz
$ echo "bar" | gzip > file2.gz
$ zcat file1.gz file2.gz | gzip -c > file1.gz

gzip: file1.gz: unexpected end of file
$ stat -c '%s bytes' file1.gz
20 bytes

值得留意这样的错误消息。


有几个可行的解决方案,但它们取决于数据的大小。

在所有情况下,如果没有一些巧妙的技巧,您将需要有足够的空间来存储原始新的输出文件立即保存在磁盘上。

写入另一个文件

$ echo "foo" | gzip > file1.gz
$ echo "bar" | gzip > file2.gz
$ zcat file1.gz file2.gz | gzip -c > file_all.gz
$ gzip -d < file_all.gz
foo
bar

使用sponge

如果数据不是太大,那么sponge实用程序将为您处理这种情况。从 stdin 读取的所有数据都是“侵泡“在任何数据写入输出文件之前。

$ echo "foo" | gzip > file1.gz
$ echo "bar" | gzip > file2.gz
$ zcat file1.gz file2.gz | gzip -c | sponge file1.gz
$ gzip -d < file1.gz
foo
bar

相关内容