はじめに
以前こちらでお話しましたが、Linuxにはbc
という計算コマンドがあります。簡単な計算であればわざわざ電卓を取り出すこともなくCUIからbc
コマンドを実行すれば一瞬で済んでしまいます。
但しbc
コマンドには出力結果が3桁区切りで表示出来ないという欠点があります。多少は調べてみましたがbc
コマンドのオプションにも、代替コマンドにも3桁区切りで出力してくれそうなものはありませんでした。
という訳で今回はbc
コマンドのインタラクティブモードを活かしたまま3桁区切りでの出力がされるように拡張してみたいと思います。
コマンドライン
ワンライナー
早速ですが下記のコマンドを実行してみて下さい。
$ bc | awk '{print $(NF-n)}' | xargs printf "%'d\n"
普段通りbc
コマンドのインタラクティブモードが起動します。例えば2000 ^ 2
等の3桁区切りで表示されそうな計算結果を入力して下さい。その後quit
で抜けて下さい。
下記の様に出力されるかと思います。
4,000,000
bc
コマンドはパイプで繋げると各計算結果をスペース区切りで次のコマンドの標準入力として渡します。次にawk
で最後のフィールドの値つまり最後の計算結果のみを取得します。最後にprintf
で3桁区切りの表示形式に整形しています。
思う所はありますが一旦これで事足りるかと思います。
関数化
ログインシェルに追記して関数化してしまいます。
bcm() {
bc | awk '{print $(NF-n)}' | xargs printf "%'d\n"
}
これで次回のターミナルログイン後からbcm
で実行可能です。ちなみに命名の意味としては「bc improved」をもじったものです。
即時反映させる場合は下記のコマンドを実行して下さい。
$ source ~/.zshrc
シェルスクリプト
シェルスクリプトとして実行する場合には下記のようなコードになりますでしょうか?大分雑な実装ですが。
#!/bin/sh
result=`bc -qi`
result=`echo ${result} | awk '{print $(NF-n)}'`
if [[ ${result} -gt 999 ]]; then
printf "%'d\n" ${result}
else
echo $result
fi
本来コマンドを作るの場合、例外処理やオプション機能のことも考慮に入れてシェルスクリプトを書くべきだと思います。
終わりに
取り急ぎ3桁区切りでの出力は叶いましたが、より良い方法が見つけられるよう精進します。