我刚刚问了一个关于过滤掉特定列中具有特定值的行的问题。
如果我现在想删除特定列中具有特定值的行。我怎么做?
例如,删除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