ターミナル上で集計処理などをしてて、数字の桁数が多いと読めなくなってくる事がある。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
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
