講座「文系のためのawkプログラミング入門」
if 文で選択・分岐を決定する条件式について学びます。条件式は、if 文だけでなく、後で見る、繰返しの条件としても使われますので、重要な項目です。
if の後に続く条件は、必ず真か偽かが判定可能な命題がきます。これを条件式と呼びます。条件式は数値を比較する算術式か、文字列に関する命題であるかのどちらかです。最初に数値を扱う算術式を見ましょう。算術式によく使われるのが等号、不等号などで、見慣れたものもありますが、使用法は学校の数学とは異なる場合があるので注意してください。
式において、数値としての大小や等、不等を表す記号を算術比較演算子と呼びます。前後に置かれた数値を表す表現(式)が等しいか等しくないか、一方が他方より大きいか小さいかなどなどを表します。
演算子 使用例 説明 < 式A < 式B 式A が 式B より小であることを表す <= 式A <= 式B 式A が 式B より小か等しいことを表す > 式A > 式B 式A が 式B より大あることを表す >= 式A >= 式B 式A が 式B より大か等しいことを表す != 式A != 式B 式A が 式B と等しくないことをあらわす == 式A == 式B 式A が 式B と等しいことを表す
とくに最後の二つが見なれないかもしれません。学校の数学で等しいを表す「=」は、awkでは代入の記号です。awkで等しいことを表すには、「==」と二つ等号を重ねます。この点はくれぐれも注意しないといけません。また不等を表す場合は「!=」と書くのも、初めてですね。これも覚えてください。
それでは、実際のスクリプトで確認しておきましょう。
# script 12-1 BEGIN{ str = "programming" if(length(str) != 10) print str " の長さは10バイトではない" else print str " の長さは10バイトである" }
length() は文字列の長さをバイト単位で返す組み込み関数でしたね。もうひとつ今度は実際のデータを使って、試してみます。
次のような成績表を data12.txt として作成します(ダウンロードできます)。
A君 60 B君 55 C君 45 D君 70 E君 30 F君 85 G君 90 H君 80
このデータを処理して、60点以上の人だけを出力するスクリプトを書きます。
# script 12-2 { if($2 >= 60) print $0 # print と書くだけでもよい }
Input欄は File Output欄は Screen で入力ファイルリストにdata12.txtを登録して実行してみて下さい。
このスクリプトは、上のデータファイルを一行ずつ読んで、第2フィールドが60点以上なら、その行全体を出力し、そうでなければなにもしません。結果として、60点以上の人だけが出力されます。
なお、上のスクリプトは、if文を使わないで、パターンに条件を設定することによって書き換えることが出来ますね。
# script 12-3 $2 >= 60{ print $0 }
ある文字列が正規表現であらわされる文字列のパターンを含んでいるか否かを示す演算子については、すでに第7回の「正規表現とパターンマッチング」で学習しました。そこでは、アクションを実行するかどうかを判断するパターンの書き方として学びましたが、if 文の条件式としても同じように使えます。例をあげておきましょう。第7回の script 7-1 を再掲しますと、以下のようでした。
# script 7-1 $2 ~ /^c/{ print FNR ":" $2 }
ここでのパターンマッチングを、if 文でアクションの中で行うこともできます。以下のようになります
# script 12-4 { if($2 ~ /^c/) print FNR ":" $2 }
このスクリプトを第7回で使った、data7.txt に対して実行して、同じ結果が出ることを確かめてください。
ある処理を実行する条件が二つあるとき、これをif文によって指定しようと思えば、if文を重ねることで実現できます。
if(条件式1) { if(条件式2) { 処理 } }
条件式1が真のとき、最初のif文の中身が実行されますが、この中にまた条件式2があり、これが真のとき初めて処理が実行されます。
このとき論理演算子を用いれば、この二つの条件式は、一つにまとめられます。
if( 条件式1 && 条件式2 ) { 処理 }
ここで、&& は論理演算子(注)です。これは日常の言葉で表すと、『and』、日本語では『かつ』となります。上の if 文は、「もし、条件式1が真で、かつ条件式2が真であれば」という意味になります。&&で条件式を結びつけたとき、ふたつの条件式がともに真であるとき、初めて、全体としても真になり、文が実行されます。
(注)算術演算子の+や−は二つの数値を結びつけて、そこから新しい数値を生み出す働きをします。&& の記号は、二つの条件式を結びつけて、全体として、新しい論理値を生み出します。『論理値』とは聞きなれない言葉でしょうが、真か偽かの二つの値を指します。数値は無限にありますが、論理値は真か偽かの二つの値しかありません。算術演算子と同様に、&& もまた新しい真か偽かの論理値を生み出すので、論理演算子と呼ばれます。
例をあげましょう。先の成績データを用いて、60以上80未満の人の成績だけを出力するスクリプトは次のようになります。
# script 12-5 { if($2 >= 60 && $2 < 80) print $0 }
同じように、data12.txt を使って実験してみて下さい。
論理演算子は && だけでなく、さらに || と ! の二つがあります。|| は、『or』『または』の意味で二つの条件式のどちらかが真のとき、全体としても真とみなす演算子です。! は && や || と違って論理値の否定を表します。『not』『…にあらず』の意味です。数につける負の記号が、数の正負を逆転するように、! は論理値の真偽を逆転します。
まとめれば以下の表のようになります。
条件式1 条件式2 条件式1&&条件式2 条件式1||条件式2 真 真 真 真 真 偽 偽 真 偽 真 偽 真 偽 偽 偽 偽 条件式 !条件式 真 偽 偽 真
はじめのうちはちょっとややこしいかもしれません。実際に使いながら慣れてください。
# script 12-6 BEGIN{ x = 8 if(x < 0 || x >10) { print x " は 0 よりも小さいか、又は 10 よりも大きい" } else { print x " は 0 以上 10 以下である" } }
Input欄はNull Output欄は Screen にして実行し、awkが正しく数の大小を判断しているか、x に代入する値を様々に変えて試してください。
次のスクリプトは ! の使用例です。
# script 12-7 BEGIN{ x = 8 if(!(x < 5)) # if(! x < 5) と書いてもよい print x " は 5 より小さくない" else print x " は 5 より小さい" }
ここで ! は x < 5 という算術式の真偽を否定して、真は偽に、偽は真に反転させます。これも、x の値を色々に変えて、試してください。
条件式の書き方の基本を見てきました。次回からは、スクリプトで、ある処理を繰返し行うループ構文の書き方を学習します。