Search on the blog

2016年4月23日土曜日

awkの連想配列を使ってユニークなデータ数を数える

サンプルファイル
 以下のようなファイルをサンプルとして用いる。
$ wc -l tmp.log 
 1000000 tmp.log
$ head tmp.log 
F 61
F 18
A 95
V 98
U 23
C 94
F 47
N 42
I 85
Q 28
1列目にアルファベット、2列目に数字があるような何らかのログファイルで、行数は100 万行。
このファイルの2列目のユニークなデータ数を数えたいとする。

sort | uniq
有名なイディオムを使うと、
$ cat tmp.log | awk '{print $2}' | sort | uniq | wc -l
100

だが、これは遅い。
手元の環境だと約12秒ほどかかる。

awkの連想配列
awk内で連想配列を使って値の出現数をカウントして、初めて出た時だけカウントするというやり方でやってみると、
cat tmp.log | awk '!seen[$2]++' | wc -l
100

速い!
手元の環境で0.7秒くらい。

ということで、sort | uniq するより awkの連想配列使った方がいいという話でした。

0 件のコメント:

コメントを投稿