2009-10-19 59 views
2

我有這幾樣重複的行,只有最後一個領域是不同的文件:如何用AWK刪除部分重複行?

OST,0202000070,01-AUG-09,002735,6,0,0202000068,4520688,-1,0,0,0,0,0,55 
ONE,0208076826,01-AUG-09,002332,316,3481.055935,0204330827,29150,200,0,0,0,0,0,5 
ONE,0208076826,01-AUG-09,002332,316,3481.055935,0204330827,29150,200,0,0,0,0,0,55 
OST,0202000068,01-AUG-09,003019,6,0,0202000071,4520690,-1,0,0,0,0,0,55 

我需要刪除該行的第一次出現,並留下第二個。

我已經試過:

awk '!x[$0]++ {getline; print $0}' file.csv 

,但它不工作的打算,因爲它也消除非重複行。

+0

您的(近)副本是否總是相鄰或可以散佈? – 2009-10-19 17:42:30

+0

它們總是相鄰的,因爲它們已經是另一個awk操作的結果。 – zedascouves 2009-10-20 10:18:54

回答

1

如果你的近重複總是相鄰的,你可以比較以前的條目,並避免產生潛在的巨大關聯數組。

#!/bin/awk -f 
{ 
    s = substr($0, 0, match($0, /,[^,]*$/)) 
    if (s != prev) { 
     print prev0 
    } 
    prev = s 
    prev0 = $0 
} 
END { 
    print $0 
} 

編輯:改劇本所以它打印一組近乎重複的在最後一個(沒有tac需要)。

1

作爲一般戰略(我沒有太多的AWK親儘管採取班級,AHO)你可以嘗試:

  1. 串接所有除 的最後一個領域。
  2. 使用此字符串作爲哈希鍵。
  3. 將整行存儲爲值爲 的哈希值。
  4. 當你處理所有行時, 循環通過散列值打印出 的值。

這不是AWK特有的,我不能輕易提供任何示例代碼,但這是我第一次嘗試。

2
#!/bin/awk -f 
{ 
    s = substr($0, 0, match($0, /,[^,]+$/)) 
    if (!seen[s]) { 
     print $0 
     seen[s] = 1 
    } 
} 
+0

這個在方括號後面需要一個星號才能匹配正確的子字符串。除此之外,它與'awk'!x [substr($ 0,1,16)] ++'file.csv'完全相同。他們都遭受打擊,因爲他們打印了一套近似重複的第一個,而不是最後一個。 – 2009-10-19 17:40:48

+0

與此訓練數據相同,即爲 – 2009-10-19 17:41:39

+0

感謝您的糾正,並抓住OP的要求 – 2009-10-19 17:56:53