私はログ分析のための集計に Excel のピボットテーブルをよく使っています。
大量データを望みの切り口で見るのに便利ですよね。
ですが、ふと思ったのです。毎回手で作ってるけどシェルでできたっておかしくないはず。その疑問を AI にぶつけた結果教えてもらったのが miller(mlr コマンド)です!
めちゃくちゃ簡単に集計処理をシェルの中に組み込んで自動化できます。
サンプルを使ってできることを紹介します。
まずは公式情報です。
README やマニュアルが充実しているので、気になった方は一度覗いてみてください。インストール方法も書いてあります。
コマンド名は mlr です。
サブコマンド方式で集計したり、条件でデータを絞ったり、列を絞ったりなどの使い分けができます。
また、それらをパイプでつなぎ組み合わせて柔軟なデータ加工が実現できます。
それでは、具体例を見ていきましょう!
stats1:ピボットの核(集計)
「カテゴリごとの合計金額」を出したい場合。
mlr stats1 -a sum -f amount -g category data.csv
オプションの意味は以下の通りです。
-
-g category: 集計の軸(Excel ピボットの行ラベル) -
-a sum -f amount: 合計を取る列
出力例
category,amount_sum
A,250
B,550
軸は複数指定できる
-g には カンマ区切りで複数の軸 を指定できます。
たとえば「ユーザー × カテゴリ」ごとの合計を出す場合は次のように書けます。
mlr stats1 -a sum -f amount -g user,category data.csv
user,category,amount_sum
Alice,A,100
Alice,B,200
Bob,A,150
Bob,B,350
Excel のピボットで「行ラベルを2段にする」イメージです。
filter:条件でデータを絞る
「Alice のデータだけにしたい」場合。
mlr filter '$user == "Alice"' data.csv
出力例
user,category,amount
Alice,A,100
Alice,B,200
Excel でいう「フィルタ」相当です。
cut:使う列だけに絞る
「集計に必要な列だけ残したい」場合。
mlr cut -f category,amount data.csv
出力例
category,amount
A,100
B,200
A,150
B,300
B,50
組み合わせて使う(ここが便利)
Excel でもよくやるように、
条件で絞ってからピボットを作る
ことが、miller でもそのまま書けます。
例:Alice のデータだけでカテゴリ別合計
mlr filter '$user == "Alice"' data.csv \
| mlr stats1 -a sum -f amount -g category
出力例
category,amount_sum
A,100
B,200
入出力フォーマットも柔軟
miller は CSV だけでなく、
- CSV
- TSV
- JSON
- YAML
などを入力にできます。
また、出力を
- CSV
- JSON
- Markdown テーブル
などに変換できます。
mlr --icsv --omd stats1 -a sum -f amount -g category data.csv
↑ これで Markdown 表が出力されます。
-
-icsv: CSV 形式で入力する -
-omd: Markdown 表で出力する
まとめ
- miller は Excel ピボットテーブルでやるような以下の操作をシェルのコマンドで分解して書けるツール
- 条件で絞る
- 列を選ぶ
- 集計する
- コマンドをシェルに書くことで以下できる
- 自動化
- 条件や集計内容の再現性の確保
Excel のピボットテーブルみたいなことをシェルでやりたいときに miller を使っています。
一方で分析の切り口を試行錯誤するときや他人に提出するときは、Excel を使い分けるのが良さそうですね。