我有一个约1,000,000行的文件。该文件有400个字段,但我对第三个文件感兴趣。此文件的外观示例如下(仅输出前8个字段和前8行):
CHROM POS ID REF ALT QUAL FILTER INFO
chr1 693731 1:693731 A G . PASS AF=0.1294;MAF=0.1294;R2=0.5931;AC=29;AN=218
chr1 715265 1:715265 C T . PASS AF=0.03657;MAF=0.03657;R2=0.35976;AC=6;AN=218
chr1 715367 1:715367 A G . PASS AF=0.03785;MAF=0.03785;R2=0.38758;AC=7;AN=218
chr1 717485 1:717485 C A . PASS AF=0.03738;MAF=0.03738;R2=0.3826;AC=7;AN=218
chr1 720381 1:720381 G T . PASS AF=0.03843;MAF=0.03843;R2=0.38578;AC=8;AN=218
chr1 721290 1:721290 G C . PASS AF=0.03823;MAF=0.03823;R2=0.38292;AC=8;AN=218
chr1 723891 rs2977670 G C . PASS AF=0.9529;MAF=0.0471;R2=0.34792;AC=209;AN=218
chr1 726794 1:726794 C G . PASS AF=0.03769;MAF=0.03769;R2=0.40295;AC=8;AN=218
我有一些重复ID
字段的行,我可以使用
cat myfile | cut -f3 | awk '{a[$0]++; if(a[$0]==2) print; if (a[$0]>=2) print}'
上述命令的输出示例:
1:186936590
1:186936590
10:54530788
10:54530788
14:50274280
14:50274280
17:51326717
17:51326717
我想要的是删除其中一个重复的条目,但保留另一个条目。字段ID
是唯一重复的字段,其余部分不同,因此我认为我无法使用awk '!a[$0]++'
有什么建议吗?
答案 0 :(得分:2)
您可以使用以下awk
命令执行此操作,我们会检查每个$3
值的散列值计数是否小于2
awk 'NR==1 || unique[$3]++ < 2' file
条件unique[$3]++ < 2
特别意味着打印该行,直到它第二次看到$3
中的值。对于后续迭代,该值将大于2,不会打印该行。
$ printf 'id\n1\n2\n1\n2\n1\n2\n' | awk 'NR==1 || unique[$0]++ < 2'
id
1
2
1
2
条件NR==1
仅对包含打印的标题信息的第一行断言。