2014-12-05 01:00 追記
はてなブックマークのコメントで @zetamatta さんより、awk
で同じことをやる例を教えていただきました。
「一般的な UNIX ツールにそれを叶えてくれるツールは探しても見つからなかった」- awk "rand() < 0.1" で済むよ!#golangjp #awk / “Go で入力をサンプリングして出力するコマンド作った - …” http://t.co/YhvDQfQEGp
— ζ (@zetamatta) 2014, 12月 7
なるほど!という感じですね。
なお実際試すと、同じファイルに対して何度実行しても同じ結果が返ります。
だいたいのケースにおいて特に問題にならないと思いますが、気にする場合は以下のようにするといいでしょう。
$ awk 'BEGIN { srand() } rand() < 0.1' file
まぁタイプ数増えて面倒ですね...
引数を省略した場合はタイムスタンプが暗黙的に使われるとのことなので、秒単位で同時であればこれも同じ結果になります。
あと、 @lestrrat さんからも同様の例が。
perl -ne ‘print if rand() <= 0.01’ でもいけそうだな
— Daisuke Maki (@lestrrat) 2014, 12月 7
もっと UNIX 的であろうと思わされた週末でした。
ログの集計・分析において、入力データが巨大で、かつ大まかな傾向さえわかれば良いというときにはサンプリングするものだと思います。
意外なことに、一般的な UNIX ツールにそれを叶えてくれるツールは探しても見つからなかったので、Go で作ってみました。
インストール
とりあえず go get
によるインストールのみに対応しています。
GitHub Releases によるバイナリ配布も、いい感じのやり方を調べてやってみたいところです。
$ go get github.com/yuya-takeyama/sample
使い方
標準入力をサンプリング
-r
でサンプリングする割合を指定します。
この場合は 1% にサンプリングされます。
$ cat hoge | sample -r 0.01
tail -f などを受け取ることもできます。
ファイルをサンプリング
ファイル名は複数指定可能です。
$ sample file1 file2
なお、-r
を省略したときのデフォルト値は 0.1 (10%) です。
Enjoy!