GNU datamashを使ってLinuxコンソール上でテキストデータの加工・集計を行う
Pocket

すこし調べ物をしていたところ、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

 

これでインストールができた。

Sponsored Links

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とかのデータを加工する際はかなり便利そうなコマンドなので、個人的にはとりあえず集計用のサーバに入れておきたいと思うコマンドだ。

 

Pocket

Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

This article has 3 comments

  1. Pingback: Linuxコンソール上でファイルの行と列を入れ替える | 俺的備忘録 〜なんかいろいろ〜

  2. Pingback: 第23回シェル芸勉強会に参加してきました(復習) | 俺的備忘録 〜なんかいろいろ〜

  3. Pingback: Linux/Macのコンソール上で出力を複数列に分割する | 俺的備忘録 〜なんかいろいろ〜

Leave a Comment

メールアドレスが公開されることはありません。