awkで重複行を削除するには、配列の概念を利用すると簡単にできます。
fileA
1 2 3 4 5 6 |
aaaaaaa bbbbbbb ccccccc aaaaaaa aaaaaaa bbbbbbb |
1 2 3 4 5 6 7 8 9 10 |
$ 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を使った処理の方は、並び変えも必要なく一周で処理が完了します。
このくらいの数じゃ速度対して変わりませんが、大量の行をやるならこっちの方がおすすめ。
コメント