Bashコマンド出力からのヒストグラムプロット

Bashコマンド出力からのヒストグラムプロット

次の出力があります。

2015/1/7    8
2015/1/8    49
2015/1/9    40
2015/1/10   337
2015/1/11   11
2015/1/12   3
2015/1/13   9
2015/1/14   102
2015/1/15   62
2015/1/16   10
2015/1/17   30
2015/1/18   30
2015/1/19   1
2015/1/20   3
2015/1/21   23
2015/1/22   12
2015/1/24   6
2015/1/25   3
2015/1/27   2
2015/1/28   16
2015/1/29   1
2015/2/1    12
2015/2/2    2
2015/2/3    1
2015/2/4    10
2015/2/5    13
2015/2/6    2
2015/2/9    2
2015/2/10   25
2015/2/11   1
2015/2/12   6
2015/2/13   12
2015/2/14   2
2015/2/16   8
2015/2/17   8
2015/2/20   1
2015/2/23   1
2015/2/27   1
2015/3/2    3
2015/3/3    2

ヒストグラムを描きたい

2015/1/7  ===
2015/1/8  ===========
2015/1/9  ==========
2015/1/10 ====================================================================
2015/1/11 ===
2015/1/11 =
...

これを実行できるbashコマンドがあるかどうかをご存知ですか?

ベストアンサー1

存在するperl

perl -pe 's/ (\d+)$/"="x$1/e' file
  • e式を評価できるようにして、対応する=値(一致する数値を含む)を再利用します。$1(\d+)
  • "="x($1\/3)代わりにできることは、行"="x$1を減らすことです。 (/交換命令中で脱出しました。)

bash(からインスピレーションを受けてこの回答):

while read d n 
do 
    printf "%s\t%${n}s\n" "$d" = | tr ' ' '=' 
done < test.txt
  • printf$n ()幅を取得するために、2番目の文字列をスペースで埋め、%${n}sスペースを=
  • 列はタブ\tで区切られていますが、パイプを介してより見やすくすることができますcolumn -ts'\t'
  • $((n/3))置換を使用して${n}行を減らすことができます。

その他のバージョン:

unset IFS; printf "%s\t%*s\n" $(sed 's/$/ =/' test.txt) | tr ' ' =

sed私が見ることの唯一の欠点は、スケールを縮小するために出力をどこかにパイプする必要があることです。それ以外の場合、これは最もきれいなオプションです。入力ファイルにこれらのいずれかが含まれる可能性がある場合は、[?*w / bootコマンドを使用する必要がありますset -f;

おすすめ記事