AWKは行を空白で分割して処理する

AWKは、入力から一行データを読むたびに空白文字を区切としてデータを分 割し、最初から順番に変数 $1、$2、$3、...に代入します。入力 のある一行がつぎのようなものだったとしましょう。

    火車  743  98/02/01  新潮社  新潮文庫 み-22-8

この場合、$1=火車、$2=743、$3=98/02/01、$4=新潮社、$5=新 潮文庫、$6=み-22-8、となります。

そこで、'{print $1;}'というプログラムを AWKに与えてやりましょう。 すると、各行ごとにこのプログラムが実行されます。つまり$1の内容であ る書名が印刷(print)されます。実際にこの仕組を使って、書名だけを取出 してみましょう。

    % gawk '{print $1;}' miyabe.data
    書名
    火車
    かまいたち
    蒲生邸事件
    堪忍箱
    クロスファイア [上・下]
    幻色江戸ごよみ
    心とろかすような
    コットン4
    今夜は眠れない
         (省略)

データファイルの順に書名が取出せていますね。自分でもやってみてください。 プログラムの前後を '{ と }' で囲っていますが、今はそういうものだ と思っておいてください。

同じように本体価格を取出してみましょう。価格は$2に納められているは ずです。

    % gawk '{print $2;}' miyabe.data
    本体価格
    743
    505
    1650
    1456
    819
    552
    マサの事件簿
    750
    552
         (省略)

途中で「マサの事件簿」という予定外のものが出力されています。元データを 良く見ると題名が「心とろかすような  マサの事件簿」となっています。

         (省略)
    クロスファイア [上・下]  819  98/10/30  光文社  カッパ・ノベルス  
    幻色江戸ごよみ  552  98/09/01  新潮社  新潮文庫 み-22-9  
    心とろかすような マサの事件簿  1300  97/11/28  東京創元社    短編集
         (省略)

「マサの事件簿」という副題がついていて、題名の前後を半角の空白で区切っ てあったため、この行では2つ目のデータが本体価格ではなく「マサの事件簿」 になって、それが $2 に代入されてしまったのです。その2冊上に「クロスファ イア [上・下]」という本があるのですが、こちらは全角の空白で区切って あるので、うまく処理されています。いまのところ、仕方ないのでこのような 区切は全角の空白を使うことにしておきましょう。のち ほど、もっとましな対策を紹介します。

この「心とろかすような  マサの事件簿」のデータを修整したファイルを miyabe.newとしておきます。

もうお分りかと思いますが、書名と出版日だけを見たいなら、$1と$3を printしてやります。ただし、$1と$3をそのまま並べると次のように 2つがひっついて表示されます。

    % gawk '{print $1 $3;}' miyabe.new
    書名発行
    火車98/02/01
    かまいたち96/09/01
    蒲生邸事件96/10/10
         (省略)

$1と$3をカンマ , で区切っておくと、適当に空白を入れてくれます。

    % gawk '{print $1, $3;}' miyabe.new
    書名 発行
    火車 98/02/01
    かまいたち 96/09/01
    蒲生邸事件 96/10/10
         (省略)

OGURISU Osamu
2004-01-15