すこし調べ物をしていたところ、GNU Datamashという非常に便利そうなコマンドを見つけたので少し使ってみることにした。
簡単に説明すると、テキストの加工や統計情報を取得するコマンドで、様々なサブコマンドを使ってそれらの機能を使い分けていくタイプのコマンドだ。
行列の入れ替えや列の反転、統計情報の計算など、コンソール上で何かやるには結構便利な機能が用意されている。
1.インストール
まずはインストール。
UbuntuやCentOS、Macの場合は、以下のようにコマンドを実行することでインストールできるようだ。
Debian/Ubuntuの場合
sudo apt-get install datamash
もしくは
wget http://files.housegordon.org/datamash/bin/datamash_1.0.6-1_amd64.deb
sudo dpkg -i datamash_1.0.6-1_amd64.deb
RHEL系の場合
wget http://files.housegordon.org/datamash/bin/datamash-1.0.6-1.el6.x86_64.rpm
sudo rpm -i datamash-1.0.6-1.el6.x86_64.rpm
OS Xの場合
brew install datamash
ソースからコンパイルしてインストールする場合は、以下のようにする。
wget http://ftp.gnu.org/gnu/datamash/datamash-1.1.0.tar.gz
tar -xzf datamash-1.1.0.tar.gz
cd datamash-1.1.0
./configure
make
make check
sudo make install
これでインストールができた。
2.実際に使ってみる
さて、それでは実際にdatamashコマンドを使ってみよう。
datamashコマンドに用意されているサブコマンドのうち、便利そうなのを抜粋して紹介する。
なお、こちらに公式の使用例が用意されているので、利用の際は目を通すと良いだろう。
行と列を反転させる(入れ替える)
datamashでは、ファイルや標準出力の行と列を入れ替えることができる。
デフォルトではタブ区切りとなっているので、空白などで区切られたファイルの場合は「-t ' '」で空白区切りを指定してやればよい。
datamash transpose < 対象ファイル
[root@BS-PUB-CENT7-01 datamash-1.1.0]# cat /tmp/test1.txt
id name prefecture value
1 aaa 1 123
2 bbb 2 544
3 ccc 1 65745
4 ddd 1 122
5 eee 2 222
6 fff 1 444
7 ggg 3 566
8 hhh 4 111
9 iii 3 12
10 bbb 2 1243
11 ddd 1 4423
[root@BS-PUB-CENT7-01 datamash-1.1.0]# datamash -t ' ' transpose < /tmp/test1.txt
id 1 2 3 4 5 6 7 8 9 10 11
name aaa bbb ccc ddd eee fff ggg hhh iii bbb ddd
prefecture 1 2 1 1 2 1 3 4 3 2 1
value 123 544 65745 122 222 444 566 111 12 1243 4423
なお、この際にもし表として空白のある状態だったらどうなるのか。
何もオプションを付けない場合だと、そのままエラーになってしまうので、「--no-strict」オプションを付けてやることで行列入れ替えができるようになる。
(以降、わかりやすいように表の区切りを空白からタブに変えた)
[root@BS-PUB-CENT7-01 datamash-1.1.0]# cat /tmp/test1_1.txt
id name prefecture value
1 aaa 1 123
2 bbb 2 544
3 ccc 1
4 ddd 1 122
5 eee 2 222
6 fff 1 444
7 ggg 3
8 hhh 4 111
9 iii 3 12
10 bbb 2 1243
11 ddd 1 4423
[root@BS-PUB-CENT7-01 datamash-1.1.0]# datamash transpose < /tmp/test1_1.txt
datamash: transpose input error: line 4 has 3 fields (previous lines had 4);
see --help to disable strict mode
[root@BS-PUB-CENT7-01 datamash-1.1.0]# datamash --no-strict transpose < /tmp/test1_1.txt
id 1 2 3 4 5 6 7 8 9 10 11
name aaa bbb ccc ddd eee fff ggg hhh iii bbb ddd
prefecture 1 2 1 1 2 1 3 4 3 2 1
value 123 544 N/A 122 222 444 N/A 111 12 1243 4423
この「N/A」の表記を別の書き方に変更する場合は、「--filler 文字列」で変更できる。
[root@BS-PUB-CENT7-01 datamash-1.1.0]# datamash --no-strict --filler AAA transpose < /tmp/test1_1.txt
id 1 2 3 4 5 6 7 8 9 10 11
name aaa bbb ccc ddd eee fff ggg hhh iii bbb ddd
prefecture 1 2 1 1 2 1 3 4 3 2 1
value 123 544 AAA 122 222 444 AAA 111 12 1243 4423
列を反転させる(リバースさせる)
サブコマンドとして「reverse」を指定することで、列を反転させて表示することができる。
datamash reverse < 対象ファイル
[root@BS-PUB-CENT7-01 datamash-1.1.0]# cat /tmp/test1_1.txt
id name prefecture value
1 aaa 1 123
2 bbb 2 544
3 ccc 1 65745
4 ddd 1 122
5 eee 2 222
6 fff 1 444
7 ggg 3 566
8 hhh 4 111
9 iii 3 12
10 bbb 2 1243
11 ddd 1 4423
[root@BS-PUB-CENT7-01 datamash-1.1.0]# datamash reverse < /tmp/test1_1.txt
value prefecture name id
123 1 aaa 1
544 2 bbb 2
65745 1 ccc 3
122 1 ddd 4
222 2 eee 5
444 1 fff 6
566 3 ggg 7
111 4 hhh 8
12 3 iii 9
1243 2 bbb 10
4423 1 ddd 11
グループ集計を行う
datamashコマンドでは、指定した列でグループを作成し、その中での最大値や最小値、中央値といった統計情報を取得することもできる。
出力させることができる統計情報については、ヘルプを見るとよいだろう。
基本的には、以下のようにコマンドを実行してやればよい。
datamash -g グループとする列 取得する統計値(minやmax、medianなど) 統計値の列数
たとえば、例として提供されているscores.txtで2列目から、最小の点数を出す場合は以下のようにする。
datamash -g 2 min 3 < scores.txt
[root@BS-PUB-CENT7-01 datamash-1.1.0]# datamash -g 2 min 3 < /tmp/scores.txt
Arts 46
Business 79
Health-Medicine 72
Social-Sciences 27
Life-Sciences 14
Engineering 39
続けて、他の統計情報を横につなげて出力させることも可能だ。
「-H」でヘッダーを出力させることもできる。(あれ?なんか…いや、見なかったことにしよう)
[root@BS-PUB-CENT7-01 datamash-1.1.0]# datamash -g 2 count 3 min 3 max 3 median 3 < /tmp/scores.txt
Arts 19 46 88 71
Business 11 79 94 87
Health-Medicine 13 72 100 91
Social-Sciences 15 27 90 62
Life-Sciences 12 14 91 58.5
Engineering 13 39 99 56
[root@BS-PUB-CENT7-01 datamash-1.1.0]# datamash -H -g 2 count 3 min 3 max 3 median 3 < /tmp/scores.txt
GroupBy(Arts) count(65) min(65) max(65) median(65)
Arts 18 46 88 72.5
Business 11 79 94 87
Health-Medicine 13 72 100 91
Social-Sciences 15 27 90 62
Life-Sciences 12 14 91 58.5
Engineering 13 39 99 56
その他にもいろいろな使い方があるようなので、とりあえず公式のExampleを見るといいだろう。
CSVとかのデータを加工する際はかなり便利そうなコマンドなので、個人的にはとりあえず集計用のサーバに入れておきたいと思うコマンドだ。
f