使用 awk 命令从 vcf.gz 文件中删除行

使用 awk 命令从 vcf.gz 文件中删除行

我刚刚问了一个关于过滤掉特定列中具有特定值的行的问题。

如果我现在想删除特定列中具有特定值的行。我怎么做?

例如,删除1/1标记为 的列中的12345行,file.vcf.gz并将其余行放入名为的新文件中newfile.vcf.gz

例如

#CHROM      POS         ALT     12345   
1           345632      T       0/1:4,4:8:99:105,0,106
4           032184      C       1/1:46,9:55:99:99,0,1222
6           843290      A       0/1:67,20:87:99:336,0,1641

预期结果:

1           345632      T       0/1:4,4:8:99:105,0,106
6           843290      A       0/1:67,20:87:99:336,0,1641

答案1

虽然这只是你上一个问题的反面

就这个。

zcat file.vcf.gz | awk '$4 !~ /^1\/1/' | gzip -c > new.vcf.gz

!如果 $4 不是该模式,则它会匹配。但是,这不会删除标题行。要删除标题行,您可以添加head -n +2到管道中。

zcat file.vcf.gz | head -n +2 |awk '$4 !~ /^1\/1/' | gzip -c > new.vcf.gz

答案2

对于删除行,我更喜欢sed

zcat file.gz | sed ':1/1:d' | gzip -c > new_file.gz

或者执行 inverse grep,忽略匹配的行:

zgrep -v '1/1' file.gz | gzip -c > new_file.gz

为了同时删除标头,请制作另一个中间sed或 stripping tail,即

zcat file.gz | sed -e ':1/1:d' -e '1d'  | gzip -c > new_file.gz
zgrep -v '1/1' file.gz | tail -n +2 | gzip -c > new_file.gz

相关内容