第10回スクリプトの実行順序の制御(はじめに)

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

これまで、スクリプトを構成する、個々の文の書き方、数値や文字列についての演算について学んできました。今回からは、これらの要素から構成される、スクリプト全体の構造、実行順序などについて見ていきます。

 I スクリプトの実行順序の概要


awkのスクリプトの構造は、既にお話したように、

BEGIN{アクション}
パターン1{アクション}
パターン2{アクション}
−−−−
END{アクション}

の形になっています。

BEGINパターンで記述されるアクションは、一回だけ、一切の入力に先だって実行されます。またENDパターンの部分は、全ての入力が終わった後に、一度だけ実行されます。中間のパターン{アクション}部分はいくつでも書くことができ、上から順番に、入力行が指定されたパターンに合致するかどうかを調べて、合致すればそのアクション部分が実行されます。これを実際に確めるために次のようなスクリプトを実行してみます。

# script 10-1

BEGIN{
	print "BEGIN部を実行中"
}
{
	print "第1のアクション : " $0
}
{
	print "第2のアクション : " $0
}
{
	print "第3のアクション : " $0
}
END{
	print "END部を実行中"
}

使うデータは次のものです(右クリックでダウンロードできます)。

data10.txt
1行目の文字列
2行目の文字列
3行目の文字列
4行目の文字列

Input欄をFile、Output欄を Screen、入力ファイルリストに上のdata10.txtを登録して実行してみてください。上のスクリプトでは本処理の部分はすべてパターンが省略されているので全て無条件に実行されます。その結果各行が三回ずつ処理されているのがわかるでしょう。

II アクション部のスクリプトの実行順序の制御

上で見たのは、スクリプト全体の実行順序です。上から下へ並べられた順番に実行され、さほど複雑ではありません。しかし、各アクションの内部では、スクリプトの書き方次第で、複雑な処理を行わせることが可能になります。ここからは、何回か、各アクションの内部でのスクリプトの実行順序とその制御を取り扱います。
入力行がパターンに合致するとアクションが実行されます。アクション部分はひとつ以上の実行文からなります。複数の実行文がある場合、単純に並べると、先頭から実行されていきます。次のスクリプトを、同じくdata10.txt に対して実行して、確めてください。

# script 9-2
{
	print "文1で出力:" $0 
	print "文2で出力:" $0
	print "文3で出力:" $0 
}

しかし場合によっては、データの条件によって、文1を実行したあとで、文2は省略し、文3を実行したいという場合があるかもしれません。あるいは、文1、2を省略して、いきなり3を実行したい場合があるかもしれません。
元になるデータや処理の目的などで、アクションの内容は大きく変わるでしょう。またスクリプトの長さも、場合によっては何十行、何百行にもなるかもしれません。筆者が今までに見たawkのスクリプトのもっとも長いものは2000行を超えているものがありました(これは、見た、だけで、とても読むところまではいかなかったですが)。

プログラミング技術の発展のなかで、如何に読みやすく、理解しやすく、従ってあとで容易に修正や改良しやすいプログラムを書くかが問題になりました。そのなかでもっとも有名なのが「構造化プログラミング」の技法です。最近読んだ本の中で、この構造化の技法を簡潔に紹介してあるのに感心しましたが、ここで引用すると、プログラムの基本3構造として、あるいはデータ処理の流れとしては、大きく分ければ、次の三つの場合が考えられます

連接
選択
繰返

連接は、9-2で示したように、順序良く上から下へと処理を実行していくことです。選択は、条件にしたがって、ある処理を実行したり省略したり、様々に分岐することを指します。また繰返は、ある処理を何度かくり返しおこなうことです。プログラムの流れはだいたいこの三つの流れの組み合わせであるといってよいでしょう。
プログラム言語はいずれも、この実行順序の制御のための文法を備えています。awkもまた同じで、連接はすでに見てきたように、実行する順序に従って、文をならべることによって可能になります。そして、選択は、if というキーワードを使って作られる、if文で行ないます。繰返は、forwhile というキーワードを使って作られる、for文やwhile文によって行なわれます。
この3つの構造を使って読みやすい、保守しやすいプログラミングをめざすのが「構造化プログラミング」の重要な技法になります(『Delphiオブジェクト指向プログラミング』塚越一雄、注)

if 文 …条件に従って選択・分岐

for 文 …繰り返し

while 文 …繰り返し

次回から数回はこの実行順序制御の問題を扱います。これらをよく知ることによって、テキスト処理の本格的な技術の基礎を築くことが出来ます。

(注)プログラミングの歴史に触れている書物では、構造化プログラミングの技法が提唱されるようになったのは、それ以前の、いわゆるgoto文(プログラムのなかの任意の場所にジャンプする機能)を多用してスパゲッティのようにもつれた、わかりにくいプログラミングの書き方を克服するためであったと、よく指摘される。著者は、そういう大昔のプログラムが複雑で読みにくいものになったのは、小さなメモリーの中に目一杯コードを詰め込むためであったと指摘していて、なるほどねと納得。


前回 次回 目次 Home