如何打印 2 列文件中第一次出现唯一值的行?

如何打印 2 列文件中第一次出现唯一值的行?

我有一个正在使用的文件的一小段:

ENSDARG00000032737    ENSDARP00000120731
ENSDARG00000032737    ENSDARP00000049290
ENSDARG00000061051    ENSDARP00000081062
ENSDARG00000061051     
ENSDARG00000061051    ENSDARP00000129708

我只想打印第一列中每个唯一值的第一个实例和第二列中的相应值,所以我想要的输出是:

ENSDARG00000032737    ENSDARP00000120731
ENSDARG00000061051    ENSDARP00000081062

有没有一种简单的方法可以使用 awk 或 uniq 或类似的东西来完成此任务?

任何帮助,将不胜感激。

答案1

POSIX AWK:

m1[$1] == 0 {
   m1[$1] = 1
   print
}

对于每行:

  1. 查看“数据库”中是否存在第一列
  2. 如果没有,添加到“数据库”并打印整行

答案2

$ sort -s -k1,1 -u file
ENSDARG00000032737    ENSDARP00000120731
ENSDARG00000061051    ENSDARP00000081062

这仅根据第一列对文件进行排序。这样做时,它会忽略第一列已被看到的行。

大多数实现sort都有一个非标准-s选项(在上面的命令中使用),以保证它将使用“稳定”的排序算法。稳定的排序算法不会改变具有相同键的条目的顺序(在您的情况下为第一列)。


但请注意,较长的文字记录(Ensembl 和哈瓦那都 100% 同意)ENSDARG00000032737基因是 ENSDART00000049291,其编码为 ENSDARP00000049290,而不是 ENSDARP00000120731。但这不关我的事。

答案3

这个惯用的解决方案将在每个 UNIX 机器上的任何 shell 中使用任何 awk 来稳健地工作:

$ awk '!seen[$1]++' file
ENSDARG00000032737    ENSDARP00000120731
ENSDARG00000061051    ENSDARP00000081062

答案4

刚刚发布我的尝试就已经提供了最佳解决方案

for i in `awk '{if(!seen[$1]++)print $1}' filename`; do sed -n '/'$i'/{p;q}' filename; done

输出

ENSDARG00000032737    ENSDARP00000120731
ENSDARG00000061051    ENSDARP00000081062

相关内容