根据文件删除数学重复的行

时间:2018-02-14 10:22:04

标签: bash awk

我有一个约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]++'

有什么建议吗?

1 个答案:

答案 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仅对包含打印的标题信息的第一行断言。