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

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

zzz
yyy
xxx
yyy
www
zzz
yyy

ソートしてよければ単にsortしてuniqすればOK。
→(2021/07/03追記)コメントにてsort -uでよいと教えていただきました。

% sort -u data.txt
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
スポンサーリンク

シェアする

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

フォローする

スポンサーリンク

コメント

  1. xxx より:

    sort -u data.txt

    • 中島篤 より:

      順序保存しないのならsort|uniqではなくsort -uで良いのですね。
      ありがとうございます。