web-dev-qa-db-ja.com

列ごとに部分的に重複する行を削除し、最後の行を保持します

次のようなファイルがあります。

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で解決策を教えてもらえますか?

24
Dagang

このコードは、2番目のフィールドごとに一意の行を取得しますが、ファイルまたはテキストの終わりから取得します(結果の例のように)

tac temp.txt | sort -k2,2 -r -u
38
PaulP
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]]}'
    
11
pepoluan
sort < bar > foo
uniq  < foo > bar

バーに重複行がなくなりました

6
nkvnkv

編集:これは実際に質問に答えるバージョンです。

sort -k 2 filename | while read f1 f2 f3; do if [ ! "$f2" = "$lf2" ]; then echo "$f1 $f2 $f3"; lf2="$f2"; fi; done
4
Erik