我有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]++'
有什么建议吗?
发布于 2018-02-14 10:32:58
您可以使用以下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只对包含打印的头信息的第一行断言为true。
https://stackoverflow.com/questions/48784766
复制相似问题