Text-Processing

刪除bash中第一列中重複的行

  • March 22, 2019

我有一個製表符分隔的 .txt 文件,並且想要刪除在第一列中有重複的行。如果這可以在沒有排序的情況下完成,那將是驚人的,但我已經同意我必須使用排序。如果我使用排序,標題無法排序,它必須保持在頂部。

測試數據集,(製表符分隔):

Symbol  ATCACGACAGACAGGT.1  ATCACGACAGCCTATA.1  TTTGTCATCATGTCTT.1  
STPG1   0   1   3
NFYA    0   0   1
STPG1   1   3   1
ABD 0   0   0
ABC 0   0   0

我的夢想輸出:

Symbol  ATCACGACAGACAGGT.1  ATCACGACAGCCTATA.1  TTTGTCATCATGTCTT.1  
STPG1   0   1   3
NFYA    0   0   1
ABD 0   0   0
ABC 0   0   0

我的下一個最佳輸出:

Symbol  ATCACGACAGACAGGT.1  ATCACGACAGCCTATA.1  TTTGTCATCATGTCTT.1  
ABC 0   0   0 
ABD 0   0   0   
NFYA    0   0   1
STPG1   0   1   3

我設法在逗號分隔的測試樣本 testc.txt 上使用了以下程式碼,但標題仍在排序中。我似乎無法找到一種方法來分配一個有效的製表符分隔符?此外,此程式碼中的標頭也有問題:

sort -u -t, -k1,1 testc.txt

也許我應該澄清一下,我不知道我的真實數據集中的行數、列數或行名是什麼。

你可以awk在這裡使用:

$ awk -F'\t' 'NR==1 || !seen[$1]++' ip.txt
Symbol  ATCACGACAGACAGGT.1      ATCACGACAGCCTATA.1      TTTGTCATCATGTCTT.1
STPG1   0       1       3
NFYA    0       0       1
ABD     0       0       0
ABC     0       0       0
  • -F'\t'將製表符指定為分隔符
  • NR==1保留標題(儘管對於給定的輸入,這不是必需的) - NR 是一個特殊變數,將具有目前行號
  • !seen[$1]++在這裡,seen數組將使用第一個欄位作為鍵,如果該值為零(第一次看到鍵),則條件將變為真

引用自:https://unix.stackexchange.com/questions/507916