講座「文系のためのawkプログラミング入門」
第6回awkにおける算術演算
awkはテキスト処理の言語ですが、計算も得意です。また、テキスト処理自体にも計算が必要になる場合があります。たとえば、あるテキストの中に一定の単語がどれくらい出現するかを数えて出力する、などという場合には計算が欠かせません。今回はawkにおける算術的、数学的な仕掛けを考察します。
コンピュータにおいて、数式を扱う場合、学校で習った数学とは少し代わった記述方式をとる場合があります。第4回で見た、代入としての = 記号の使い方はその典型です。この他にもいくつか覚えておかなければならないものがあります。先ず四則演算の記号から見ていきます。
まず、加算と減算は、それぞれ半角の +、− で表すのは学校の数学と同じですが、乗算は * 除算は / で表します。
小手調べです。次のスクリプトの実行結果を予想してみて下さい。
# script 6-1 (Input:Null, Output:Screen で実行。以下同じ) BEGIN{ print 6 + 2 print 6 - 2 print 6 * 2 print 6 / 2 }
例によって、Input欄 Null Output欄 Screen で実行してみて下さい。簡単でしたね。
既に x = 5 という式が代入式であることは理解されたと思います。しかしawkでの代入式の本当の特色は次のようなところにあります。
# script 6-2 BEGIN{ x = 5 x = x + 3 print x }
さあ、このスクリプトの実行結果を予測してみて下さい。これを理解できれば、あとは難しいことはなにもありません。二番目の式が問題ですね。これを等式として理解すると頭を抱えることになります。しかし、= は代入だということを思い出してください。この場合、最初に x に 5 が代入されます。次に2番目の式の右辺をみると、その x に 3 が加算されます、そうすると8 になります。その 8 が今度は x という今まで 5 が入っていた変数(容器)に入れられるわけです。今までの 5 という値は消えて、x の値は 8 になっています。従って、実行の結果は
8
となります。実際に実行して確かめてください。これは四則演算すべてに応用できます。
# script 6-3 BEGIN{ y = 5 y = y - 3 print y z = 6 z = z * 2 print z w = 12 w = w / 3 print w }
全て実行結果の予測がつくでしょうか。実行して確かめてください。
プログラマはどうも、手抜きできるところは手抜きしたがる傾向があるようで、算術式の書き方でも独特の省略法を使います。とくにC言語とawkにはそれが多いようです。どちらも開発者に共通の人物がいるためか、はたまた昔はコンピュータのメモリが高価で、できるだけ、データを圧縮するためであったのか、真相はわかりません。しかし、これも慣れないといけないもののひとつで、慣れると、たしかに便利!と思うことがないでもありません。
まずスクリプトで示ししましょう。script 6-2 6-3 をあわせて、省略法で書いたものです。
# script 6-4 BEGIN{ x = 5 x += 3 # x = x + 3 と同じ print x y = 5 y -= 3 # y = y - 3 と同じ print y z = 6 z *= 2 # z = z * 2 と同じ print z w = 12 w /= 3 # w = w / 3 と同じ print w }
実行してみて下さい、同じ結果がでるのがわかるでしょう。
さらによく使う省略法は次のものです。
# script 6-5 BEGIN{ x = 6 x++ # x += 1 又は x = x + 1 と同じ print x y = 6 y-- # y -= 1 又は y = y - 1 と同じ print y }
結果は想像できるでしょうか? ++ はインクリメント、−− はデクリメント演算子と呼ばれ、それぞれ x = x + 1、y = y − 1 と同じです。 変数の値を1ずつ増やしたり、減らしたりします。実行して結果を確かめてください。このような省略法はawkとC言語で共通しています。慣れておけば、いつかC言語を学ぶときに、驚かなくてすむでしょう。
awkは数値の計算のために、いくつか独自の組込み算術関数を用意してくれています。関数は小さなデータ処理機のようなもので、一定のデータを入れれば、それに特定の処理を施して返してくれるものです。ここではそのような組込み算術関数の使用例を示しておきます。ひとつ覚えれば使い方は同じです。int関数を例にとりましょう。これは、与えられた数値の小数点以下を切り捨てて返してくれます。
# script 6-6 BEGIN{ y = int(97.65) print y print int(34.777) w = 100.23 z = int(w) print z }
関数は関数名(ここでは int )の後に()をつけて、その中に処理したい数値なり、変数なりを入れます。int(x) という具合です。この()の中にはいるものを、引数 といいます。関数によっては、引数を複数取るものがあります。関数は引数を処理して、その結果を返してくれます。これを返値、関数が返してくれる値、と言います。int(97.65) という式全体で、関数の返値が表されます。従って、それを y に代入するときは、上のように、y = int(97.65) と書きます。また直接それを表示したければ、print int(97.65) と書いても良いのです。
もうひとつ平方根をもとめる関数の例を見ましょう。平方根を求める関数はsqrt(x)です。引数を一つとって、それの平方根を返してくれます。
# script 6-7 BEGIN{ x = sqrt(100) print x print sqrt(16) z = 144 w = sqrt(z) print w }
結果を予測し、実行して確かめてください。そんなに難しいものでもないでしょう。awkの算術関数はそんなに数は多くありません。おーくの友だちのヘルプに載せておきましたので、調べてみて下さい。awkにはこのような、数値を処理する算術関数だけでなく、文字列を処理する文字列関数もあります。さらにプログラマが、なんども繰り返し行う処理を、独自の関数(これをユーザ関数と呼びます)にして、スクリプティングの効率をあげることができるような仕組みが備わっています。これは、このawkの講座の最後の項目として取上げる予定です。次回はawkの組込み文字列関数について見ていきます。