【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で管理することにしました。機能追加もしました。