サンプルファイル
以下のようなファイルをサンプルとして用いる。$ 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 281列目にアルファベット、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 件のコメント:
コメントを投稿