兩列

2016-09-27 21 views
1

我有四列兩列

3022751,6656,7656,T029957 
3022751,6054,7054,T029957 
3022751,10400,10400,T029958 
3022751,10400,10400,T029958 

我想刪除已在列2和3的重複行的文件中刪除行具有重複的值,所以我期望的輸出是這樣

3022751,6656,7656,T029957 
3022751,6054,7054,T029957 

我,awk腳本工作正常,但不刪除重複行這樣

awk '!x[$2,$3]++' FS="," 

電流輸出是

3022751,6656,7656,T029957 
3022751,6054,7054,T029957 
3022751,10400,10400,T029958 

謝謝。

+0

爲什麼你會認爲'!x [$ 2,$ 3] ++'會刪除$ 2 == $ 3的行? –

+0

你的意思是擦除其中兩個和三個字段相等的行,或者消除另一行第二列中具有相同值的所有行(以及第三列中相同)?在你公開的情況下,這兩條規則都適用。 –

回答

2
awk -F, '$2!=$3' file 

閱讀Arnold Robbins撰寫的Effective Awk Programming第4版。

+1

感謝您的幫助,Ed。 – pali

+1

你,不客氣。請參閱http://stackoverflow.com/help/someone-answers –

0

grep

$ cat ip.txt 
3022751,6656,7656,T029957 
3022751,6054,7054,T029957 
3022751,10400,10400,T029958 
3022751,10400,10400,T029958 

$ grep -vE '^[^,]+,([^,]+),\1' ip.txt 
3022751,6656,7656,T029957 
3022751,6054,7054,T029957 
  • ^[^,]+,第一列和,
  • ([^,]+)捕獲第二列
  • \1向後引用所捕獲的組
  • 所以,如果發生了這樣的匹配,不打印行,禮貌-v選項
+1

如果第四列的性質發生變化,這可能會刪除比預期更多的行。 – potong

+0

@potong,true - 我的答案完全針對給定的輸入和所需的處理...可能會相應地調整正則表達式,或者在其他情況下使用'-P'選項來構建lookahead/lookbehind構造..'awk/perl'會在一般情況下更好.. – Sundeep

+0

@potong,進一步分析,發現我以前的正則表達式會刪除第3行和第4列相同的行。現在修改現在只限於第2和第3列匹配..謝謝:) – Sundeep