シェルスクリプトで数値を3桁ごとにカンマ区切りで表示する(Number Format)

2022-10-12Bash,Linux

はじめに

桁数の多い数値を見やすくするために、3 桁ごとにカンマ区切りで表示することがあります。
昔の現場では「カンマ編集」と言われていました。
また、多くのプログラミング言語に組み込み関数として用意されています。

金額をページ内に表示するとき利用されますね。

ex) 1,234,567

シェルスクリプトで実現する方法について取り上げます。

検証環境

$ uname -moi
x86_64 MacBookPro11,4 Darwin

$ bash -version | head -n 1
GNU bash, バージョン 5.0.11(1)-release (x86_64-apple-darwin18.6.0)

printfコマンドを使う ( シェルがBash 5系である場合 )

printf コマンドを利用すれば OK。

シェルがBash 5系以上である場合は、組み込みコマンドであるprintfが利用できます。
数値を出力するためのフォーマットは%dですが、%dの間に'(シングルクォート)を挿入するとカンマ区切りで表示されます。

# 普通にprintfで数値を出力する場合
$ printf "%d\n" 1234567890
1234567890

# カンマ区切りのフォーマッタを使って出力する場合
$ printf "%'d\n" 1234567890
1,234,567,890

sedコマンドを使う ( シェルがBash 5系でない場合 )

Bash が利用できなかったり、バージョンが古い場合にはsedで頑張ってみます。

$ echo 1234567890 | sed -E ':l; s/^([0-9]+)([0-9]{3})/\1,\2/; t l;';
1,234,567,890

簡単に解説すると、以下のような処理をsedで行っています。

  1. :コマンドでlという文字列でラベル付けする(goto 文のような機能
  2. sコマンドで置換する
  3. tコマンドでlラベルまで移動する。
    • ※ただしtコマンドは直前のsコマンドで置換が行われなかった場合は移動しない

ひとこと

Bash5 系でしかつかえない便利機能、ちょいちょいありますね。
地味に便利な機能が多い。

2022-10-12Bash,Linux