【awk】重複行の削除

awk
mbll / Pixabay
この記事は約2分で読めます。

awkで重複行を削除するには、配列の概念を利用すると簡単にできます。

fileA

aaaaaaa
bbbbbbb
ccccccc
aaaaaaa
aaaaaaa
bbbbbbb
$ cat fileA | awk "!a[$0]++"
aaaaaa
bbbbbb
cccccc

// ファイルを作るのめんどくさかったからこっちで実験でも可
$ echo -e "aaaaaa\nbbbbbb\ncccccc\naaaaaa\naaaaaa\nbbbbbb" | awk '!a[$0]++'
aaaaaa
bbbbbb
cccccc

これは何をしているかと言うと、awkの行出力の条件が、「!a[$0]++」は、一回目の「aaaaaa」行を処理する際にはa[‘aaaaaa’]=0と評価され、それの否定なのでtrueとなり出力されます。
二回目の「aaaaaa」行の処理の際には、一つ前の処理で1が追加されているので、a[‘aaaaaa’]=1と評価され、それの否定なのでfalseになりその行は出力されません。

何がいいのか?

普通にコマンドで重複行を削除するとなったら、下記のように処理するのが普通かと思います。

$ cat fileA | sort | uniq

ただ、これの場合には、sortで一回全ての行を処理して、更にその後uniqでも全ての行を処理する必要があります。

一方awkを使った処理の方は、並び変えも必要なく一周で処理が完了します。

このくらいの数じゃ速度対して変わりませんが、大量の行をやるならこっちの方がおすすめ。

コメント

タイトルとURLをコピーしました