AWKって何するもん?

例えば、大学のコンピュータにあるファイルを自宅に持って帰りたい。でも ちょっと大きいのが幾つかあるからフロッピー1枚に収まるだろうか?なんてこ とはありがちです[*]。とりあえず、  ls -l でファイルの大きさをチェックしてみましょう。

    % ls -l
    合計 101572
    -r--r--r--   1 ogurisu  ogurisu   280396  5月 20日 1999年 auctex-9.9p.tar.gz
    -r--r--r--   1 ogurisu  ogurisu   169498  5月 26日 1999年 cmail-2.59.13.tar.gz
    -rw-r--r--   1 ogurisu  ogurisu  1319271 10月 24日  08:32 gnuplot_3.7.tar.gz
    -rw-r--r--   1 ogurisu  ogurisu   822766  9月 27日  18:59 ruby-1.6.1.tar.gz
    -r--r--r--   1 ogurisu  ogurisu    51458  7月 15日 1998年 sh-text.tar.gz
    -r--r--r--   1 ogurisu  ogurisu   257496  5月 20日 1999年 yatex1.66.tar.gz
    % 

それぞれのファイルの大きさを合計して1.4メガバイト(約1,400,000バイト)を 超えなければフロッピー1枚に収まるでしょう。そこで、電卓を取出して -- 電卓プログラムを起動して -- ファイルサイズを合計しましょ う。

これって、なんかだか変だと思いませんか? ファイルサイズのデータはコン ピュータの中にあるのに、それをわざわざ人間の手で電卓(プログラム)に入力 するんですか?

こんなとき AWKを知っていれば、次のようにコマンドライン一発で計算でき ます。2900885バイトもあるので、全然フロッピーに収まりませんね。

    % ls -l | gawk '{a+=$5;} END {print a;}'
    2900885
    % 

パイプ | の後ろにあるgawk AWKのコマンドです [*]。そのあとに '{a+=$5;} END {print a;}' と、なんだか呪文のようなことを書いていますが、これが AWKのプログラムです。

このプログラムは次のようにファイルに保存して実行することもできます。ファ イル名はなんでも良いので、例えばsum.awkとしましょう。

    #!/usr/local/bin/gawk -f
    # sum.awk:
    {
        a += $5;
    } 
    END {
        print a;
    }

そしてさきほどの gawk 'a+=$5; END print a;' を gawk -f sum.awk  に置き換えて実行します[*]

    % ls -l | gawk -f sum.awk
    2900885
    % 

AWKでは、 C Fortranと違いコンパイルも不要です。ぱっと書いて、 ぱっと実行する。もし間違っていても、ちゃっちゃと書きなおして、すぐに再 実行できます。lsのような他のプログラムから出力される大量のデータを要約 するなどの作業に適しています。単純だけど人間が手でやるには面倒くさい作 業を肩代りさせる使い棄てのプログラムに便利です[*]

また、sin(x)の値を区間[0,π] で100等分して出力したいなんて簡単な計算のときは、わ ざわざ Cを使わなくても、次のようなスクリプトsin.awkを作っ て実行すれば十分です。

    #!/usr/local/bin/gawk -f
    # sin.awk:
    BEGIN {
        for (i = 0; i <= 100; i++)
            printf("%1.6f\n", sin(i*3.1415/100));
    }

% gawk -f ./sin.awk

書式が Cに似ていると思いませんか? Cを少し知っていれば新しく覚える ことは極わずかです[*]

なお、 AWKという名前は作者の3人の頭文字を並べたもので、Kは「プログラ ミング言語 C」の著者 Kerninghanです。Aは名著「データ構造とア ルゴリズム」の著者の一人 Aho、Wは Weinbergerです。情報 科学の三巨人の共作ですね。

OGURISU Osamu
2004-01-15