第12回スクリプトの実行順序の制御(その3)… 条件式

講座「文系のためのawkプログラミング入門」

if 文で選択・分岐を決定する条件式について学びます。条件式は、if 文だけでなく、後で見る、繰返しの条件としても使われますので、重要な項目です。

I 条件式

if の後に続く条件は、必ず真か偽かが判定可能な命題がきます。これを条件式と呼びます。条件式は数値を比較する算術式か、文字列に関する命題であるかのどちらかです。最初に数値を扱う算術式を見ましょう。算術式によく使われるのが等号、不等号などで、見慣れたものもありますが、使用法は学校の数学とは異なる場合があるので注意してください。

1)  算術比較演算子

式において、数値としての大小や等、不等を表す記号を算術比較演算子と呼びます。前後に置かれた数値を表す表現(式)が等しいか等しくないか、一方が他方より大きいか小さいかなどなどを表します。


演算子       使用例			   説明 
< 		式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 として作成します(ダウンロードできます)。

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
}


2) 文字列適合演算子

ある文字列が正規表現であらわされる文字列のパターンを含んでいるか否かを示す演算子については、すでに第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 に対して実行して、同じ結果が出ることを確かめてください。


II 条件式の複合と論理演算子

ある処理を実行する条件が二つあるとき、これを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 の値を色々に変えて、試してください。

条件式の書き方の基本を見てきました。次回からは、スクリプトで、ある処理を繰返し行うループ構文の書き方を学習します。


前回 次回 目次 Home