ターミナル上で3桁ごとの桁区切りをさせて数字を読みやすく表記させる

ターミナル上で集計処理などをしてて、数字の桁数が多いと読めなくなってくる事がある。numfmtコマンドが使えるかと思ったのだが、システムで使用する数字を変換(1024MB→1GBとか)する場合は良いとして、ただの数字の桁区切りはできないようだ。という訳で、他で数字を桁区切りさせる手法について調べてみた。

1.printfで桁区切りをさせる

bashの組み込みコマンドであるprintfを使う場合、以下のように「%’d」でフォーマットを指定してやるとよい。

printf "%'d\n" num
echo num | printf "%'d\n" $(cat) # パイプから入力を受ける場合
[root@BS-PUB-CENT7-01 ~]# printf "%'d\n" 12345
12,345
[root@BS-PUB-CENT7-01 ~]# printf "%'d\n" 1234567
1,234,567
[root@BS-PUB-CENT7-01 ~]# echo 12345 | printf "%'d\n" $(cat)
12,345
[root@BS-PUB-CENT7-01 ~]# echo 1234567 | printf "%'d\n" $(cat)
1,234,567
Sponsored Links

2.awkを使って桁区切りをさせる

awkを使って桁区切り表示させる場合、内部でawkのprintfを使ってやれば良さそうだ。

echo num | awk '{printf("%\047d\n",$1)}'
echo num | awk '{printf(fmt,$1)}' fmt="%'d\n"
[root@BS-PUB-CENT7-01 ~]# echo 12345 | awk '{printf("%\047d\n",$1)}'
12,345
[root@BS-PUB-CENT7-01 ~]# echo 1234567 | awk '{printf("%\047d\n",$1)}'
1,234,567
[root@BS-PUB-CENT7-01 ~]# echo 12345 | awk '{printf(fmt,$1)}' fmt="%'d\n"
12,345
[root@BS-PUB-CENT7-01 ~]# echo 1234567 | awk '{printf(fmt,$1)}' fmt="%'d\n"
1,234,567

 

3.sedを使って桁区切りをさせる

sedを使う場合、残念ながらprintfを使っての方法は使えないようだ。
で、どうも\Bで文字間を表現できるようなので、それを利用してやることで以下のように実行することで、桁区切りが行えるようだ。

echo num | sed -r ':a;s/\B[0-9]{3}\>/,&/g;ta'
[root@BS-PUB-CENT7-01 ~]# echo 12345 | sed -r ':a;s/\B[0-9]{3}\>/,&/g;ta'
12,345
[root@BS-PUB-CENT7-01 ~]# echo 1234567 | sed -r ':a;s/\B[0-9]{3}\>/,&/g;ta'
1,234,567

 

 


Written by blacknon

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

Leave a Comment

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

*