如何使用 sed 修改 gzip 压缩文件,然后再次压缩该文件?

如何使用 sed 修改 gzip 压缩文件,然后再次压缩该文件?

我有一个 .vcf.gz 文件,具有以下方面:

#CHROM  POS     ID      REF     ALT          
chr1    10894   chr1:10894:G:A  G       A         
chr1    10915   chr1:10915:G:A  G       A          
chr1    10930   chr1:10930:G:A  G       A 

我想修改 CHROM 列以删除“chr”并将其替换为任何内容,因此我希望得到如下结果:

#CHROM  POS     ID      REF     ALT          
1    10894   chr1:10894:G:A  G       A         
1    10915   chr1:10915:G:A  G       A          
1    10930   chr1:10930:G:A  G       A 

因此,我编写了以下命令行:

zcat input.vcf.gz | sed 's/^chr//' > output.vcf.gz

它起作用了。问题是我想将输出文件保存为压缩文件,扩展名为 vcf.gz。即使我写了“output.vcf.gz”,输出文件也不会被压缩。

如何修改压缩文件然后再次将其另存为压缩文件?

非常感谢!

答案1

zcat实际上只是 的一个便利函数gzipgzip//引用gunzip手册zcat页( man zcat):

zcat命令与 相同gunzip -c

正如你可以在管道程序链中使用gunzip -c(或)一样,你可以再次使用 来压缩:zcatgzip

zcat input.vcf.gz | sed 's/^chr//' | gzip > output.vcf.gz
#                                    ^^^^

或者

gunzip -c input.vcf.gz | sed 's/^chr//' | gzip > output.vcf.gz
#^^^^^^^^                                 ^^^^

如果你喜欢一致性。

就是这样。这里的所有都是它的。

哦,在这里打赌:你正在做生物信息学,你的 vcf 文件实际上是一个“Variant Call Format”文件,并且可能相当大。gzip不是一个非常快的解压缩器,而是一个相当慢的压缩器。如果您无法使用 gzip 压缩文件格式,

unpigz -c input.vcf.gz | sed 's/^chr//' | pigz > output.vcf.gz
#^^^^^^^^                                 ^^^^

pigz与 完全相同gzip,但可扩展到多个 CPU 核心。用它。

如果你是不是必须将这些文件保存在 gzip 容器中,但可以自由选择更现代的格式,

unpigz -c input.vcf.gz | sed 's/^chr//' | zstd   -T0   -8 > output.vcf.zst
# decompress using     |                | ^^^^   ^^^   ^^
# unpigz instead of    |     modify     |  \--\   \-\   \\  compression ratio
# gzip/zcat            |                |      \     \    \ -0=very fast 18=very compressed
#                      |                |       \     \     -8 is much better compressed
#                      |                |        \     \    than gzip --best, but faster
#                      |                |         \     \
#                      |                |          \     \- Use as many threads as CPU cores
#                      |                |           \
#                      |                |            \
#                      |                |             \---- Use zstd instead of gzip

答案2

只需在管道中添加 gzip:

zcat input.vcf.gz | sed 's/^chr//' | gzip > output.vcf.gz

相关内容