第3回 フィールドとレコード(続き)

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

フィールド(欄)レコードのお話の続きです。またスクリプトファイルについても学びます。
awkに実行させる仕事が一行で書ききれない場合は、ファイルを作って、そこに実行すべき処理内容を書きます。これをスクリプトファイルと呼びます。実体は普通のテキストファイルですが、他のテキストファイルと区別するために独自の拡張子をつければ良いでしょう。なんでも良いですが、この世界では「.awk」がお約束です。

(注)「おーくの友だち」の「ファイル→環境設定」メニューでスクリプトファイルの拡張子を設定できます。デフォルトでは「awk」となっています。

Uフィールドとレコードの応用
では、フィールド分割を利用して住所録整形スクリプトを作ってみましょう。フィールドへの分割のもうすこし詳しい説明もやります。

いま次のようなコンマ区切( いわゆるCSV形式です )の住所録データがあるとします。ここから宛名用シールをつくる例を考えてみます。
次のように、よみ,姓,名,郵便番号,住所,電話番号,勤務先の順番でデータが並んでいます。

住所録データ.txt
おぶち,小渕,恵三,100-0014,東京都千代田区永田町4丁目1番地,03(3456)7890,日本政府
はしもと,橋本,龍太郎,100-0014,東京都千代田区永田町2丁1番地,03(3456)1234,日本政府
みやざわ,宮沢,喜一,100-0014,東京都千代田区永田町1丁目2番地,03(3456)6789,日本政府
むらやま,村山,富市,100-0014,東京都千代田区永田町3丁目1番地,03(3456)8901,日本政府
もり,森,喜朗,100-0014,東京都千代田区永田町1丁目1番地,03(3456)7890,日本政府

宛名シールは

郵便番号
住所
氏名

が記されているものにします。上の例ではたとえば

〒100-0014
東京都千代田区永田町4町目一番地
小渕恵三様

というような宛名シールを作りたいわけです。このためには、

1)フィールドをコンマで区切るようにする

前回書きましたように、awkはデフォルトでは半角空白をフィールドの区切りに用います。しかしこの場合はコンマでフィールドを区切るほうが便利です。そこでフィールドの区切文字( 欄区切子あるいはフィールドセパレータと呼びます)をコンマに変えてやります。ここが今回のポイントです。
前回、組込み変数として $1,$2,...などを紹介しましたが、ここで紹介するフィールドセパレータも組込み変数のひとつです。

半角空白かタブ
半角空白
入力フィールドセパレータ(欄区切り子)
出力フィールドセパレータ(欄区切り子)

FS という変数には入力行(レコード)をフィールドに区切るときの目印である、フィールドセパレータが入っています。これは上に示したように、デフォルトでは半角空白かタブです。また出力するときのフィールドセパレータはOFSという変数に入っています。今回はOFSは使いません。

ここでは、入力ファイルはコンマ区切りですから、入力フィールドセパレータ FS を コンマに変えてやる必要があります。コンマに変えてやれば、awkはコンマを区切り文字として、フィールドの分割を行うようになります。これは、ファイルを読み込む前に設定する必要があるので、BEGIN部で行います。コンマは文字なのでダブルクォーテイションで囲みます。

BEGIN{
    FS = ","
}

2)次に読みこんだ行の中から郵便番号と住所、氏名を取り出します。

それぞれ何番目のフィールドかわかりますね。郵便番号は4番目、住所は5番目、姓は2番目、名は3番目です。これらを順番に出力するためのスクリプトは、

{
    print $4
    print $5
    print $2 $3
}

となります。

Vスクリプトファイルをつくる

この場合、スクリプトは一行では収まりませんから、スクリプトはファイルに記入します。おーくの友だちでスクリプトファイルをつくる方法を簡単に示しておきます。

1)おーくの友だちを立ち上げて


・「Script」欄で「File」がチェックされていることを確かめる
・ウィンドウ中央の「新規スクリプト」ボタンをクリックし
・スクリプト名、ここでは「宛名シール」とします、を入力、「作成」ボタンを押す。



2)編集画面で、上のスクリプトを入力します。以下のようになります。




入力し終わったら、保存してください。

3) 「住所録データ.txt」を作成して、入力ファイルリストに登録する。

このページの最初に載せた、「住所録データ.txt」ファイルを作って、入力ファイルリストに登録してください(以下のようになります)

4) 試してみましょう。試すときは画面に出力すればよいでしょう。Output欄で、Screen を選んで実行します。


5)すこし修正しましょう。

・宛名シールですから、名前の後には「様」をつけたいですね。また郵便番号の前には「〒」の記号を入れなければなりません。
・また、姓と名の間に空白をいれましょう。
・さらに、一人分の宛名シールの後には空白の行をいれて、切り離しやすいようにします。
・スクリプトには、あとで読んだときに理解しやすいように注釈を入れておきます。自分で書いたスクリプトも時間がたつと、他人の書いたものと同じで適切な注釈をつけておくことが、スクリプトの再利用などに役に立ちます。
スクリプトは次のようになります。

BEGIN{ 
	FS = "," 
}
{	
    print "〒" $4           #郵便場号を出力
    print $5                #住所 
    print $2 " " $3 "様"    #氏名
    print ""                #空白行を出力
}

6) 実行します。

結果は以下のようになります。



こうなりましたか?こうならなければ、もう一度スクリプトを見なおしてください。また住所録ファイルのほうも同じ物かどうか見なおしてください。
念のためコマンドプロンプトで実行する場合も示しておきましょう。以下のようなコマンドラインになります。

gawk -f "宛名シール.awk" "住所録データ.txt"


うまく行けば、ファイルに出力し、印刷すれば実用的な宛名シールになります。今回は、スクリプトファイルの使い方と、フィールドを区切る文字としての組込み変数のFSについて学びました。次回はawkにおける一般的な変数の扱いと利用方法について、見ていきます。

前回 次回 目次 Home