講座「文系のためのawkプログラミング入門」
今回はスクリプトの実行順序を選択・分岐させる if 文と if 文で条件判定に用いられる条件式について考察します。
if 文にはいくつかのバリエーションがあります。典型的なものを紹介すると、
if ( 条件式 ) { 実行文1 … } 実行文2 …
ここで条件式とは、例えば a > b (a 大なり b)のように、真か偽か、つまり正しいか間違っているかが判定できる式をさします。そして常に条件式は( )で囲みます。このような条件式の作り方については、次の項目で詳しく見ますが、if 文では、( )内の条件式が真のとき、実行文1以下が実行されます。 条件式が真でなければ、実行文1以下は実行されず、処理はすぐ、その後の実行文2以下に移ります。
また、実行文が一つだけのときは、{ } を省略してもかまいません。その際には
if(条件式) 実行文
と書きます。実行文は、if 文よりも少し字下げして書いたほうが読みやすいでしょう。
さらに実行文が一つのときには、
if ( 条件式) 実行文;
と書くこともできます。ただしこのときには、実行文のあとにセミコロンをつけて、文の終了する場所を明示する必要があります。
また { }のつけ方も
if (条件式){ 実行文 }
という書き方も可能です。要するに、どこからどこまでが条件で、それに対応する実行文はどこなのかが、後から見たときに、はっきりわかる書き方をする必要があります。
# script 10-1 BEGIN{ x = 10 # …(1) x に値を代入 if(x > 5) { print "x は 5 より大なり" } print "End" }
Input欄 Null Output欄 Screen で実行してみてください。(1)で、x に 代入する値を変えて実行してみてください。awkは 条件式が真か偽かにしたがって、最初のプリント文を実行したりしなかったりします。
if文のバリエーションに、elseを付加するものがあります。次のような形式です。
if ( 条件式 ) { 実行文1 … } else { 実行文2 … }
この場合は、 条件式が真の時には実行文1が、偽のとき、すなわち、その他の場合は(else は『その他』を意味する英語ですね、中学校で習いました) 実行文2以下が実行されます。
# script 10-2 BEGIN{ str = "cat" if(length(str) > 5) # str の長さが5バイトより大なら { print str " の長さは5バイトより大なり" } else { print str " の長さは5バイト以下なり" } }
これも、strに代入する文字列を変えていろいろと試してください。strの中身に従って、二つのプリント文のどちらかが実行されます。
if-else 文のバリエーションです。else にさらに if をつけて条件判定を細かく行ないます。
if ( 条件式1 ) { 実行文1 … } else if( 条件式2 ) #その他でもし条件式2が真なら { 実行文2 … }
条件式1が真のとき、実行文1以下が実行され、条件式1が真でなく、かつ条件式2が真のとき、実行文2以下が実行されます。条件式1が真でなく、さらに条件式2も真でなければなにも実行されません。この場合注意しないといけないのは、awkは条件式1をテストして、条件式1が真でない場合のみ、条件式2をテストします。条件式1が真であれば、実行文1が実行されて、そのあとは、else if の条件判定そのものが無視されます。
上の三つが if 文の代表的な使い方ですが、2) と 3) を組み合わせて
if (条件式1) 実行文1 else if(条件式2) 実行文2 else 実行文3
とすることもできます。下の例のようになります
#script 10-3 BEGIN{ str = "cable" if(length(str) < 3 ) print str " の長さは 3 バイト未満" else if( length(str) < 10) print str " の長さは 3 バイト以上 10 バイト未満" else print str " の長さは 10 バイト以上" }
str に代入する値をいろいろに変えて、このスクリプトの実行がどのように変化するか試してください。
さらに、次のような組み合わせも可能です。
if (条件式1) 実行文1 else if(条件式2) 実行文2 else if(条件式3) # ここで合格しなければ、何も実行されない 実行文3
この様に、判定すべき条件をさらに、細かく設定することもできます。else if 文はいくつ追加してもかまいません。また
if ( 条件式1) { if( 条件式2 ) { 実行文 … } }
というように if 文を入れ子構造にすることも可能です。
このような if 文を使いこなすために知っておくべきことは、条件式の書き方です。上では文字列の長さや数値がある数より大か小かという簡単なものでしたが、これはさらに複雑な場合があります。次の回で条件式の書き方を学びます。