Go で入力をサンプリングして出力するコマンド作った


2014-12-05 01:00 追記

はてなブックマークのコメントで @zetamatta さんより、awk で同じことをやる例を教えていただきました。

なるほど!という感じですね。

なお実際試すと、同じファイルに対して何度実行しても同じ結果が返ります。
だいたいのケースにおいて特に問題にならないと思いますが、気にする場合は以下のようにするといいでしょう。

$ awk 'BEGIN { srand() } rand() < 0.1' file

まぁタイプ数増えて面倒ですね...
引数を省略した場合はタイムスタンプが暗黙的に使われるとのことなので、秒単位で同時であればこれも同じ結果になります。

あと、 @lestrrat さんからも同様の例が。

もっと UNIX 的であろうと思わされた週末でした。


ログの集計・分析において、入力データが巨大で、かつ大まかな傾向さえわかれば良いというときにはサンプリングするものだと思います。
意外なことに、一般的な UNIX ツールにそれを叶えてくれるツールは探しても見つからなかったので、Go で作ってみました。

yuya-takeyama/sample

インストール

とりあえず 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!