我使用zcat
和gzip
来合并和压缩文件:
zcat file1.fastq.gz file2.fastq.gz | gzip -c > file1.fastq.gz
现在,我有 0 个字节file1.fastq.gz
请指教?
答案1
当您使用>
重定向时,shell 将打开命名文件(file1.fastq.gz
)进行写入并将其截断为零长度。(文档)
接下来,zcat
将运行,以file1.fastq.gz
和file2.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