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