第1回awkとはどんな言語か

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

I awkの動作

コンピュータが、あるいはコンピュータ上の一つのプログラムが行う作業は、通常三つの部分に分かれます。データを読み込み、処理を行い、その結果を画面に表示したり、ファイルに書き出したりすることです。たとえば、画像処理のプログラムであれば、読み込むデータは、写真やイラストなどの画像であり、処理はそれらを様々に加工すること、そして、その結果を画面に表示したり、印刷したりします。この三つの過程を、

(1) データの入力(input)

(2) データの処理

(3) データの出力(output)


と呼びます。awkの場合は、入力するデータは、テキストであり、出力するのもテキストです。この限りではワープロソフトとほとんど代わりませんが、処理の部分が全く異なります。ワープロであればユーザはキーボードから文字を入力したり、マウスでクリックしたりと多様な作業を行いますが、awkの場合は、処理は一連の作業手続きを記述したプログラム(これをスクリプトと呼びます)によって指示し、例外的な場合を除いて、最後まで自動的に進行します。うまくスクリプトを書けば、人間が手作業でテキストを加工する場合の何百倍もの速さと正確さで作業を行うことが出来ます。このようなawkのテキスト処理の過程を整理して示せば次のようになります。

(1) 与えられたテキストを一行ずつ読み込み(入力)

(2)一行ずつ、スクリプトによって指示された処理を実行し

(3)その結果を表示したり、書き出す(出力)

これを、与えられるテキストがなくなるまで繰り返します(注)

(注)一行ずつ処理を行うという、この単純さがawkのプログラミングを非常に簡単にしてくれます。通常のプログラミング言語、CやBasic、またパスカルなどに比べて、awkをはるかに習得しやすい言語にしています。しかもテキスト処理のために考案された様々なawkの仕掛けは、大きな威力を発揮します。習得が容易であるにもかかわらず、その能力が実に大きいと言う点で、テキスト処理の分野で、おそらく、awkを凌ぐ言語はないでしょう。ただし、この単純さが思わぬ難問をプログラマに課す場合もありますが、それを解く楽しみはもう少し先のことです。


従って、このようなawkを動かすための、プログラマの仕事は

(1)読みこむテキストデータを指定し、

(2)処理の具体的な内容を記述し(これがスクリプトになります、ここがawkのプログラマの実際の仕事です)、

(3)処理した結果をどこに出力するのかを指定する。

ということになります。

awkに与える入力データは、基本的にはテキストファイルです。awkを動かす環境によっては、クリップボードやキーボードなどが使える場合があります。また出力先も、テキストファイルが基本ですが、クリップボードや、ウィンドウなどが使える場合もあります。本講座では、awk本体である、gawk( GNU awk を、WILLs氏がWin用に移植された、gawk.exeを想定)と、gawkを効率よく使うための、拙作のWin用のインターフェイス「おーくの友だち」を使用します。「おーくの友だち」を使ったgawkの使用法が解説の中心になりますが、このソフトはMacOS9で使える、山下巌氏のJgawk Interface をお手本に作ったものなので、解説する内容は、Jgawk Interfaceにもそのまま通じるだろうと思います。


II スクリプト

awkが行う作業の手順を記述したプログラムを普通はスクリプトと呼びます。awkのスクリプトは、次の三つの部分から構成されます。


BEGIN{アクション}           #準備作業
パターン1{アクション1}    #本処理
パターン2{アクション2}    #本処理
	-----
END{アクション}             #後始末



BEGIN部は、入力データを読みこむ前に行う、準備作業を記述します。ここを記述すれば、awkを立ち上げた場合、無条件に、記述されたアクションを実行します。準備作業がなければここは省略することができます。。
パターン{アクション} で、実際に入力データを処理します。従って、ここを省略することは普通はありませんが、BEGIN部のみを使ってスクリプトのテストなどを行う場合、この本処理の部分を省略することもあります。
END部は、全ての入力を処理し終わった後に行う後始末やまとめの作業を記述します。これもなければ省略されます。

従って、awkのスクリプトの中心は、本処理の



パターン {アクション} 


です。これを、普通の言葉に直すと、読みこんだ一行が、あるパターンに一致するなら、{ } の中の、アクションを実行せよということです。実物をお目にかけましょう。



/東京/{print}


これは、「読みこんだ一行のなかに『東京』という単語があれば、その行をプリント(出力)せよ」という処理を命じています。「東京」の前後にある記号 // はこれが正規表現だということを表しています。この一行のスクリプトで、読み込んだファイルの中の「東京」と言う語を含む行がすべて出力されます。実際には、目的に応じて{ }の中の処理をさらに詳しく記述していくことになります。



III 実際に動かしてみる
では、実際にawkを動かしてみましょう。まず処理すべきデータファイルを用意します。次のような内容のテキストファイルを作って「data.txt」と名づけてください。




東京は日本の首都です 
日本の首都は東京 
明日は東京に出張します 
大阪は商業都市です 
うまいもんなら大阪 
今日は大阪にいます 




次に「おーくの友だち」を立ち上げてください。(インストールについては、おーくの友だちのヘルプを参照してください)

1)スクリプトの設定

「Script」の欄で「One-Liner」を選びます。次に真中の細長いコンボボックスに



/東京/{print} 


と入力します

2)入力ファイルの設定
「Input」欄で「File」が選択されているのを確認して、「data.txt」をおーくの友だちの入力ファイルリスト(一番大きなリストボックスです)にドラッグする。
あるいは書類アイコンのボタンをクリックして選択する。

3)出力の設定

「Output」欄で「4 Screen」を選択してください。

下のようになります



4)「実行」ボタンを押す
一瞬の後、ウィンドウが開いて処理結果を表示します。



もし、スクリプトに誤り等があれば"Error" と赤で表示されたウィンドウが開き、awkの返した、エラーメッセージが表示されます。その時は、上のスクリプトに間違いがないかどうかもう一度確認してください。一字でも間違いがあれば、融通の利かないコンピュータは動いてくれません。


コマンドプロンプトで動かす場合も簡単に説明しておきましょう。
1)「gawk.exe」のあるディレクトリ(フォルダ)に「data.txt」を置く

2)コマンドプロンプトを開き、コマンドを打ち込んでカレントディレクトリを「gawk.exe」のあるディレクトリに設定する。
gawk.exe が C ドライブの 「gawk」というディレクトリの中にある場合




C:\Windows>cd C:\gawk



3)gawkを実行するために次のコマンドを打ち込む




gawk '/東京/{print}' data.txt


4)リターンキーを叩く
以下のように表示されます。


東京は日本の首都です 
日本の首都は東京 
明日は東京に出張します 

と、東京の二字のある行が抜き出されています。

IV まとめ
うまく実行できたでしょうか。今回使ったawk独自の命令は、



print



の1語だけです。これだけでもなかなかの仕事をしてくれるでしょう。次回はawkの本処理の部分の約束事をもう少しくわしくみていきます。
(2005/06/20改定)

前回 次回 目次 Home