2011-03-25 39 views
21

我有一個文件:消除部分重複行的列並保持,看起來像這樣最後一個

2011-03-21 name001 line1 
2011-03-21 name002 line2 
2011-03-21 name003 line3 
2011-03-22 name002 line4 
2011-03-22 name001 line5 

每個名字,我只希望它的最後一次亮相。所以,我希望得到的結果是:

2011-03-21 name003 line3 
2011-03-22 name002 line4 
2011-03-22 name001 line5 

可能有人給我使用bash/awk的解決方案/ sed的?

回答

35

此代碼得到的uniq線由第二場,但是從文件或文本的結尾(就像你的結果爲例)

tac temp.txt | sort -k2,2 -r -u 
+0

這是一個優雅的解決方案! – Martin 2011-03-25 09:43:05

+0

非常好:)謝謝 – Dagang 2011-03-25 12:59:14

+1

希望tac在OSX上。 – 2013-05-02 12:57:15

4

編輯:這是一個實際回答問題的版本。

sort -k 2 filename | while read f1 f2 f3; do if [ ! "$f2" = "$lf2" ]; then echo "$f1 $f2 $f3"; lf2="$f2"; fi; done 
11
awk '{a[$2]=$0} END {for (i in a) print a[i]}' file 

如果出現的順序是非常重要的:

  • 基於首次亮相:

    awk '!a[$2] {b[++i]=$2} {a[$2]=$0} END {for (i in b) print a[b[i]]}' file 
    
  • 基於最後一次亮相:

    tac file | awk '!a[$2] {b[++i]=$2} {a[$2]=$0} END {for (i in b) print a[b[i]]}' 
    
+0

這很好 - 簡單而強大。如果這很重要,那麼輸出的順序與輸出的順序不匹配。有沒有簡單的方法來解決這個問題? – Paul 2011-03-25 08:11:09

+0

@Paul是的,但是這會導致更復雜的awk程序。我會編輯我的答案。 – pepoluan 2011-03-25 08:12:58

+0

其實,我的意思是顛倒陣列的打印,而不是選擇哪個條目。因此輸出的時間順序是:第3行,第4行,第5行,而不是第5行,第4行,第3行。哦,等等,是的 - 我明白你就是這麼做的 - 它的確很複雜。 – Paul 2011-03-25 08:24:43

6
sort <bar> foo 
uniq <foo> bar 

酒吧現在已經沒有重複的行

+1

考慮到OP的例子,所有的行將被視爲唯一。他只希望第二個領域被用來確定唯一性。 – gdw2 2012-03-01 15:13:02

+1

+1 ...但是這回答了標題(此時'bash消除重複行'),這正是Google似乎用來在這裏發送給我的內容! – sage 2013-12-27 23:26:56

相關問題