如何列印 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

相關內容