我有一个 .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
实际上只是 的一个便利函数gzip
;gzip
//引用gunzip
手册zcat
页( man zcat
):
该
zcat
命令与 相同gunzip -c
。
正如你可以在管道程序链中使用gunzip -c
(或)一样,你可以再次使用 来压缩:zcat
gzip
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