dcを使うと老化防止になりそうなので、日常的に使おうかと思います。
どんな時に使えば良いのでしょう。いろいろ考えてみましょう。
まずは数列の総和。まあ1から10を足す計算をわざわざ一つずつ足すことはないですよね。
awkとbcと比較すると、
takk@deb8:~$ dc<<<`seq 10`'[+z1<f]sflfxp' 55 takk@deb8:~$ seq 10|awk '{s+=$1}END{print s}' 55 takk@deb8:~$ seq -s+ 10 | bc 55 takk@deb8:~$
awkより少し短くて済みます。でも、awkの方がわかりやすいので、あえてdc使う必要はなさそうです。
総和をするのは決まった数字ではなく、おそらくファイルに記述された数値の一覧なので、ファイルを対象にしてみます。
まずはランダムなリストを作ります。
takk@deb8:~$ seq 100 | perl -pe 's/.*/int rand 10000/e' > list takk@deb8:~$ head list 6683 2816 6437 1345 7004 8288 4165 3747 3588 6473 takk@deb8:~$
dcとawkとbcで比較します。
takk@deb8:~$ (cat list;echo "[+z1<f]sflfxp")|dc 475981 takk@deb8:~$ awk '{s+=$1}END{print s}'<list 475981 takk@deb8:~$ fmt -2222 list | tr ' ' + | bc 475981 takk@deb8:~$
今度はdcが一番長くなってしまいました。echoを使う分ロスします。
短くするには、総和のマクロ部分をファイルにするしかありません。
takk@deb8:~$ echo "[+z1<f]sflfxp">sum takk@deb8:~$ dc list sum 475981
とても短くなりましたが、sumというファイルは、カレントディレクトリにしか存在しませんし、sumコマンドというコマンドもあるので、扱いにくいです。
考え方を変えてみます。
リストの方に、計算式もくっつけてしまいます。
takk@deb8:~$ echo "[+z1<f]sflfxp">>list takk@deb8:~$ dc list 475981 takk@deb8:~$
こちらの方が取り扱いが楽そうです。
上の結果のようにマクロ実行の行を増やしても良いし、下のようにデータの横でもいいでしょう。
takk@deb8:~$ tail list 3880 3210 4774 8142 2366 8564 581 5248 9052 448 [+z1<f]sflfxp takk@deb8:~$
マクロを工夫すれば、計算結果を分かりやすく表示することもできます。
takk@deb8:~$ dc list NUM:100 SUM:475981 AVR:4759.810 takk@deb8:~$
listファイルの最後はこうなっています。
takk@deb8:~$ tail list 8142 2366 8564 581 5248 9052 448 z[NUM:]npsa [+z1<f]sflfx[SUM:]np 3kla/[AVR:]np takk@deb8:~$
マクロを含んだExcelブックの感覚です。
コメント