AWKマスターへの道のり アドベントカレンダーの3日目
https://qiita.com/advent-calendar/2019/awker
環境
$ awk -V
GNU Awk 5.0.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.1.2)
やりたいこと
重複した行をユニークにする。(uniqコマンドを使わないで)
コード
// uniqコマンドを使う場合
$ cat target.tsv | sort | uniq
// awkをのみを使ったバージョン
$ cat target.tsv | awk -F'\t' '!a[$0]++'
何をしているのか??
a[$0]は、つまりその行すべてをキーにした配列です。
それを評価した後にインクリメントします。
つまり、
1回目 > 0
2回目 > 1
3回目 > 2
...
と評価されるわけです。
awkでは0以外の値はすべてtrueなので、一回目だけfalseで後はすべてtrueということになります。
これを「!」で逆の評価にしているので、一回目の出力のときだけtrueで、後はすべてfalseになり、最初の一回目だけ出力されるというわけです。
※awkコマンドでは、パターンのみを書いてアクションを書かない場合には、tureの時にprint $0が実行されます。
sort | uniq よりも早い
sortの後にuniqを実行すると、一度すべての行をなめて整列させた後に、再びすべての行に対して重複のチェックを行うので二度手間です。
なお、上記のawkコマンドでは並べ替えはしませんが、順番まで正しくしたいのであれば、awkコマンドで重複なくした後にsortしたほうが処理が少なくなるのでおすすめです。
最後に
awkコマンドすげー。