すっかりスルー気味でしたが、クロス集計用のコマンドがあります。

Pocket
LINEで送る

こんにちは。風邪ひき大王です。執筆は最後の生業とどなたかが言っていましたが、私も体が弱っていてここに何か書くくらいしか気力が起きません。

以前ウェブで、@iktakahiroさんの「コマンドでクロス集計する」というのが反響を呼んでいました。

AWK User会(たぶんさいとうさん)もやってます。

シェル芸勉強会にいつも参加してくださるくんすとさんも、インスパイアされているご様子。

Tukubaiのmapコマンドがそれ

そんでもって、Tukubaiの総本山である某社のエンジニアは、シェル(シェルスクリプト)でクロス集計などは一日に何度もやっているので、それ専用のコマンドを使っています。

例えば、くんすとさんのところのデータ:

A       Ice     130
A       Ice     180
B       Juice   120
B       Ice     130
I       OREO    210
I       OREO    210
I       OREO    210

(空白はタブではなくスペースです。)

をクロス集計したければ、次のようにコマンドを使います。

まずsm2という集計のコマンドで、同じキーを持つレコードを足し算します。

uedamac:~ ueda$ cat data | sort | sm2 1 2 3 3 
A Ice 310
B Ice 130
B Juice 120
I OREO 630

さて、これで1列目を縦軸、2列目を横軸に持って行きたいわけですが、mapというコマンドで一発です。

uedamac:~ ueda$ cat data | sort | sm2 1 2 3 3 | map num=1
* Ice Juice OREO
A 310 0 0
B 130 120 0
I 0 0 630

おわりに

わたしからも、bash(シェル)最強、と申し上げておきます。Tukubaiのオープン版はこちらこちらにありますのでステマしておきますね。join系のコマンドもあります。

しゃっくりが止まらないので寝るます。

Pocket
LINEで送る