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

2020-02-05Bash, Linux

はじめに

桁数の多い数値を見やすくするために、3桁ごとにカンマ区切りで表示することがあります。
(昔の現場では「カンマ編集」といったり、言語組み込み関数ではnumber_formatとして用意されていたりする機能です。)
金額出力時にはよく利用されるでしょう。

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系の便利機能、ちょいちょいありますね。
地味に便利な機能が多い。

2020-02-05Bash, Linux