ソートせずに重複行を除く

例えば以下のようなデータから重複行を除く。

zzz
yyy
xxx
yyy
www
zzz
yyy

ソートしてよければ単にsortしてuniqすればOK。

% sort data.txt | uniq
www
xxx
yyy
zzz

ソートせず、一番最初に出てきたときのみ表示する場合は一工夫必要。

% awk '!a[$0]++' data.txt
zzz
yyy
xxx
www

各行に対して、まず「!a[$0]」が評価される。
連想配列「a[$0]」で行全体をキーとして値を取り出してみて、
初めてのキーなら「a[$0]」が0なので「!a[$0]」は1になるから行全体が表示される。
その後「++」されるので、「a[$0]」に値として1が入る。
そのため初めてでないなら「!a[$0]」がfalseになって表示されない。
という仕組みみたい。
よく考えるな…

一番最後に出てきたときのみ表示するなら以下かな。

% tac data.txt | awk '!a[$0]++' | tac
xxx
www
zzz
yyy
スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク