忘れないようにメモっとく

機械学習とかプログラミングとか。

awkで重複行を高速削除する。

awkで重複行を高速削除する。

行の重複削除で調べるとよく出てくるのが、sort & uniqを使ったコマンド。 ソートはファイルが大きくなると、実行にかなり時間がかかってしまいますね。

ソートせずに高速実行できるのが、次のawkコマンド。

awk '!colname[$1]++{print $1}'

こういうファイルがあって、一列目の名前を取得したいとき、!colname[$1]は、データをキーにした連想配列で、インクリメントされる。

ボブ りんご          | colname["ボブ"] → 0 {print $1}
マイケル まんが      | colname["マイケル"] → 0 {print $1}
マイケル まんが       | colname["マイケル"] → 1
サブロー PC         | colname["サブロー"] → 0 {print $1}
サブロー キーボード   | colname["サブロー"] → 1
ステファン PC       | colname["ステファン"] → 0 {print $1}
サブロー まんが       | colname["サブロー"] → 2
ステファン まんが     | colname["ステファン"] → 1

条件として!をつけているので、二回目以降はFalseとなって、そのデータが最初に現れた行だけを出力するというわけ。ソートは要らないね。

対象の列番号を変えたいときは、上のコマンドの$1を$2とか$3とかにすればおk。