2016-03-02 24 views
1

刪除線`vu`我有下面的測試數據:如何從一個文件時行`uv`已經存在使用unix命令

a b 
a c 
b a 
b c 
b d 
c a 
c b 
c d 
d b 
d c 

,我想,當行u v已經存在使用刪除線v u unix命令。比如在這裏我想獲得:

a b 
a c 
b c 
b d 
c d 

我曾與一個awk腳本,但對長文件試圖花費太多的時間:

{ 
if(NR==1){ 
    n1=$1 
    n2=$2 
    test=0 
    k=0 
    i = 0 
    column1[i]=$1 
    column2[i]=$2 
    printf "%s %s\n", column1[i], column2[i] 
} 
else{ 
    for(k=0; k<=i;k++){ 
     if(column1[k]==$2){ 
      test=1 
      tmp=i 
      break 
     } 
    } 
    if(test==1){ 
     if(column2[tmp]==$1){ 
      n1=$1 
      n2=$2 
     } 
    } 
    else if(n1!=$1||n2!=$2){ 
     n1=$1 
     n2=$2 
     i++ 
     column1[i]=$1 
     column2[i]=$2 
     printf "%s %s\n", column1[i], column2[i] 
    } 
    test=0 
} 
} 

是否有人有想法?

回答

4

我認爲這是可以很簡單地實現:

awk '!seen[$1,$2]++ && !seen[$2,$1]' file 

僅打印線(默認操作)時,第一和第二列尚未以任何順序觀察。

數組seen通過設置包含第一個和第二個字段的鍵來跟蹤每一對字段。表達式!seen[key]++僅當第一次測試特定的key時纔是正確的,因爲數組中的值每次都增加。

相關問題