【Perl】TSVの指定カラムの数値を手軽に棒グラフにして分かりやすくする
2017-02-02-2
[Perl][Programming]
コマンドラインで簡単に棒グラフを表示するやつ。
TSVを入力として、指定のカラムの数値を棒グラフ化。
棒はTSVの最後に追加して出力。
よくワンライナーでやってるんだけど、スクリプト版もあった(発掘した)ので公開。
Perl です。
入力データ(2009.tsv): 空白のところはタブです。
実行例:第3カラム(5桁の数値の列)を指定(-k 3)、長さはマックス30文字(-w 30)、使う文字はピリオド(-c .)。
コード(tsv2bargraph.pl):
TSVを入力として、指定のカラムの数値を棒グラフ化。
棒はTSVの最後に追加して出力。
よくワンライナーでやってるんだけど、スクリプト版もあった(発掘した)ので公開。
Perl です。
入力データ(2009.tsv): 空白のところはタブです。
2009-01 439 69305 2009-02 336 45463 2009-03 373 45845 2009-04 430 46441 2009-05 306 49709 2009-06 407 66057 2009-07 551 88944 2009-08 402 60289 2009-09 442 52836 2009-10 505 59128 2009-11 557 71414 2009-12 525 81157
実行例:第3カラム(5桁の数値の列)を指定(-k 3)、長さはマックス30文字(-w 30)、使う文字はピリオド(-c .)。
ちょっと見やすく:$ ./tsv2bargraph.pl -k 3 -c . -w 30 2009.tsv 2009-01 439 69305 ....................... 2009-02 336 45463 ............... 2009-03 373 45845 ............... 2009-04 430 46441 ............... 2009-05 306 49709 ................ 2009-06 407 66057 ...................... 2009-07 551 88944 .............................. 2009-08 402 60289 .................... 2009-09 442 52836 ................. 2009-10 505 59128 ................... 2009-11 557 71414 ........................ 2009-12 525 81157 ...........................
$ ./tsv2bargraph.pl -k 3 -c x -w 50 2009.tsv | cut -f1,4 2009-01 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 2009-02 xxxxxxxxxxxxxxxxxxxxxxxxx 2009-03 xxxxxxxxxxxxxxxxxxxxxxxxx 2009-04 xxxxxxxxxxxxxxxxxxxxxxxxxx 2009-05 xxxxxxxxxxxxxxxxxxxxxxxxxxx 2009-06 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 2009-07 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 2009-08 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 2009-09 xxxxxxxxxxxxxxxxxxxxxxxxxxxxx 2009-10 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 2009-11 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 2009-12 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
コード(tsv2bargraph.pl):
#!/usr/bin/env perl
use strict;
use warnings;
use List::Util qw(max);
use Getopt::Long;
my $key = 1;
my $width = 50;
my $ch = "|";
GetOptions(
"key=s" => \$key,
"width=s" => \$width,
"char=s" => \$ch,
);
$key-- if $key;
my @lines = map {chomp; [split(/\t/, $_)]} <>;
my $max = max(map {$_->[$key]} @lines);
foreach my $lr (@lines) {
my $len = int($lr->[$key] / $max * $width);
print join("\t", @$lr, ($ch x $len))."\n";
}
関連記事
- スタージェスの公式とそれによるヒストグラム出力スクリプト(Perl)[2014-04-22-1]
- tsv2bargraph (github)
- 追記170920: githubで管理することにしました。機能追加もしました。
