はじめに
以前こちらでお話しましたが、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,000bcコマンドはパイプで繋げると各計算結果をスペース区切りで次のコマンドの標準入力として渡します。次に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桁区切りでの出力は叶いましたが、より良い方法が見つけられるよう精進します。