少量の数値データの集計

小ネタ、小技

ちょっとした3つ、4つの数値のSUMを取りたいときに、わざわざ表計算ソフトを起動するのは面倒臭い。

電卓を使っても良いが、デスクトップをスワイプして電卓アプリにフォーカスを当てるのが面倒臭い。できることなら、作業中にはマウスにあまり触れたくない。

ケータイなどスマートデバイスで電卓を起動するという手もあるが、あれは飲み会の会計時に1円単位でワリカンするために用意されているのであって、プログラマーが使うべきアイテムであるはずがない。


こんなとき、IT技術者であれば、コンソール画面を使うのがよいと思うのだ。

Ruby

Rubyの環境が構築されているなら、とても簡単。

ruby -e 'puts [1, 2, 3, 4, 5].inject(:+)'


定数を記述しているところに集計したい数値を入れれば良いわけだが、

ruby -e 'p ARGV.map{|s|s.to_i}.inject(:+)' 1 2 3 4 5

こうした方がコマンドの使い回しはしやすいかもしれないね。

(:+) のようなシンタックスが顔文字に見えるというRubyに関する苦情は今のところ聞いていない。


シェル

しかし、特定のサーバーでの作業中など、Ruby環境が必ずしも構築されているとは限らない。いかにも、この程度のことはshでも簡単にできる。

echo `expr 1 + 2 + 3 + 4 + 5`

bash, zsh, kshあたりなら、exprを使わずに $(( )) で演算できるのでもう少しタイプしやすい。

echo $((1 + 2 + 3 + 4 + 5))

bashzshならば、$[ ] でも演算可能だそうな。

echo $[1 + 2 + 3 + 4 + 5]

AWK

CSVファイルなどから集計データを読み込むような場合にはawkが便利だ。

records.csv

2
3
5
7
11
13
17
19
23
29
cat records.csv | awk '{sum += $1} END {print sum}'

上記例では1列しかないテーブルの数値を集計しているが、複数列を持つCSVの特定の列を集計するのであれば、$1のところを、$2とか$3とかにしてやればよいわけだ。便利ね。


Vim

もしもVim上に存在する数値テキストを集計したいという状況であれば、そもそもコンソール画面に移動して数値を入力するのが面倒臭い。

たとえば、Vim上で、

10243
10247
10253

こんな風に改行されたいくつかの数値のSUMを計算したいとしたら、ビジュアルモードで集計したい数値を選択し、コマンドで

:'<,'>!awk '{sum += $1} END {print sum}'

としてやれば、その場でフィルタできる。

あるいは、例えば数値データが92行目から94行目に存在するならば、ビジュアルモードを使わずに、行番号を指定して、

:92,94!awk '{sum += $1} END {print sum}'

としてもよい。


更に、このような作業をVim上で頻繁に行うのであれば、

ここの人の
http://nanasi.jp/download.html

expr.vimとかを使えば便利そうだ。



他には、自身の暗算能力を高めるという単純かつ地道な策も考えられるが、これは下策であろう。コンピューター以外の、ましてやヒトの計算結果を信用するわけにはいかない。私の脳はすでに老化し始めている。



おしまい