删除基于第一列的表中的重复条目(该表由冒号分隔的两个值组成)

时间:2019-05-23 09:27:05

标签: shell sorting unix awk sed

我需要根据第一列(表示chr:position)上的值,对大表(以空格分隔)中的重复条目进行排序和删除。

初始数据如下:

1:10020 rs775809821
1:10039 rs978760828
1:10043 rs1008829651
1:10051 rs1052373574
1:10051 rs1326880612
1:10055 rs892501864

输出应如下所示:

1:10020 rs775809821
1:10039 rs978760828
1:10043 rs1008829651
1:10051 rs1052373574
1:10055 rs892501864

我尝试遵循this post及其变体,但是改编后的代码不起作用:

sort -t' ' -u -k1,1 -k2,2 input > output 

结果:

1:10020 rs775809821

有人可以建议吗? 谢谢!

2 个答案:

答案 0 :(得分:1)

使用awk时非常容易。将文件分割为空格或:作为字段分隔符,并按冒号后的单词将行分组

awk -F'[: ]' '!unique[$2]++' file

-F[: ]定义了字段分隔符,用于分割行上的各个单词,而部分!unique[$2]++根据$2的值创建一个哈希表映射。每当在$2中看到一个值时,我们都会增加该值,以便在下一次迭代时,该行上的否定条件!将阻止该行再次打印。

并非所有-F版本都支持使用awk标志定义正则表达式。以符合POSIX的方式,您可以

awk '{ split($0,a,"[: ]"); val=a[2]; } !unique[val]++ ' file

上面的部分假定您要基于:之后的单词来唯一化文件,但要完全基于第一列,只需 即可

awk '!unique[$1]++' file

答案 1 :(得分:0)

由于您的输入数据非常简单,因此该命令将非常简单。

sort file.txt | uniq -w7

这只是对文件进行排序,并使用前7个字符进行唯一处理。如果命令中有使用-i的步骤,则前7个字符的数据为数字。