LoginSignup
0
0

More than 3 years have passed since last update.

AWKコマンドで重複をなくす(ユニークにする)

Posted at

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コマンドすげー。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0