2017-06-20 61 views
1

這裏是新手,我需要刪除包含兩列中重複項的行(即row1和row2在列1中具有相同的值,刪除其中一行並保留一行做一列是相同的)文件是製表符分隔AWK識別兩列中的重複項但打印第一個實例

下面是示例數據

580615 580795 Del 
580769 580795 Del 
656123 657154 Del 
656123 657195 Del 

預期輸出中

580769 580795 Del 
656123 657154 Del 

我使用bash,這是一箇中間步驟我正在開發一條管道。

我曾嘗試使用這種

awk 'seen[$1, $2]++ == 1' file 

awk 'n=x[$1,$2]{print n"\n"$0;} {x[$1,$2]=$0;}' file 

,但我沒有得到任何輸出。

任何建議將不勝感激 謝謝!

+0

wrt'這是我正在開發的管道中的一箇中間步驟' - 你幾乎可以肯定在一個awk腳本中做任何事情都比在一堆單獨的管道和命令中做得更好。如果在另一行的第一列和第二列中有值,那麼應該[編輯]您的示例以顯示預期的輸出是什麼 - 現在是idk,如果那將被視爲重複行。在你的例子中包括這些將毫不費力,並使這個要求變得清晰。 –

回答

0

如果我理解正確的話,你可以這樣做:

awk '{ f[$1]+=1; s[$2]+=1; if(f[$1]==1 && s[$2]==1) print $0;}' file

您捕捉每一個線和計數出現的次數爲每列(˚F IRST和小號的Econd)。如果這兩列是新的,那麼我們打印該行。

1

您可以使用awk這樣的:

awk '!a[$1]++ && !b[$2]++' file 

580615 580795 Del 
656123 657154 Del 

這使2個關聯數組ab與第1列和第2列的唯一值。

+1

嗨非常感謝它措辭完美! –

+0

很高興知道它解決了[[您可以點擊答案左上角的勾號**標記答案](http://meta.stackexchange.com/a/5235/160242) – anubhava

0

$ cat file

580615 580795 Del 
580769 580795 Del 
656123 657154 Del 
656123 657195 Del 
  1. 使用sort

    $ sort -uk1,1 file | sort -uk2,2 
    

-k1,1各種各樣的第一行,並刪除重複的,然後

-k2,2排序第二行,並刪除重複

使用 sortuniq
  • $ sort -uk1,1 file | uniq -f1 
    
  • 輸出繼電器:

    580615 580795 Del 
    656123 657154 Del 
    

    如果添加-rsort

    $ sort -uk1,1r file | sort -uk2,2 
    

    然後輸出中

    580769 580795 Del 
    656123 657154 Del 
    
    0

    嘗試:Anubhava解決方案的簡單一些的版本。

    awk '!array1[$1] && !array2[$2]{print;} {array1[$1]=$1;array2[$2]=$2}' Input_file 
    

    所以在這裏檢查條件如果!ARRAY1 [$ 1]表示如果當前行的第一個字段是不存在於陣列命名陣列1,類似地,如果$ 2是不存在於數組2然後打印當前行。然後在array1中創建索引爲$ 1,值爲$ 1的數組元素,然後創建索引爲$ 2,值爲$ 2的array2。