我有一個正在使用的文件的一小段:
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
}
對於每行:
- 查看「資料庫」中是否存在第一列
- 如果沒有,請添加到“資料庫”並列印整行
答案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