dc用にデータと計算マクロの抱き合わせ

1-5.スタック

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ブックの感覚です。

コメント

タイトルとURLをコピーしました