AWK

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動

AWK についての入門用教科書です。AWKは習得が比較的容易なテキスト処理スクリプト言語です。名称の AWK は、開発者であるアルフレッド・エイホ(Alfred Aho)、ペーター・ワインバーガ(Peter Weinberger)、ブライアン・カーニハン(Brian Kernighan)の3人の頭文字に由来し、 "オーク" と読みます。

Wikipedia
ウィキペディアAWKの記事があります。


処理系に触れてみる[編集]

Windows環境用にはGawk for Windowsgawk 3.1.5 for Windowsなどがあります。UNIX系のOSをご利用の場合、デフォルトでインストールされていることがほとんどです。

まずは何か文字を表示してみましょう。コマンドラインから次のように入力してください。

 awk 'BEGIN{ print "hello, world" }'

hello, world と表示されましたね。

少し難しいかも知れませんが、次はawkが得意とするパターンマッチングに基づくテキストファイルの処理を見てみます。 student.dataという以下のようなファイルがあったとしましょう。

Ichiro 85 63
Hanako 82 78
Toyoko 77 62
Yumiko 68 91

これは左から生徒の名前、国語の点数、英語の点数を表記しています。英語が70点以上の生徒の国語の点数の合計を求めてみましょう。 コマンドラインから以下のように入力します。

awk 'BEGIN{ x = 0 } $3 >= 70 { x = x + $2 } END { print x }' student.data

そうすると、 150 と表示されます。

プログラムの構造[編集]

先ほどのプログラムで何が起こっているのか考えてみましょう。

awk というのは awk スクリプトを実行するためのコマンドです。スクリプト本体は'(シングルクオート)で囲まれています。

BEGIN {  }

という構造がありますが、これはプログラムを起動した時、最初に実行される部分です。ここで

x = 0

としているのは「変数xに0を代入しなさい」という意味です。

END {  }

という構造は、最後に実行される部分です。ここで

print x

となっているのは「変数xの値を表示しなさい」という意味です。

問題は以下の部分です。

 $3 >= 70 { x = x + $2 }

これは以下のような構造になっています。

 パターン { アクション }

studento.data 一行ずつ読み込んでいき、読み込んだ行がパターンに該当(マッチ)した場合のみ { } 内のアクションを実行するようになっています。 $3 というのは3番目のフィールド、つまり Ichiro の行で言えば 63 を意味します。同じく $2 といえば2番目のフィールドということになります。肝心の実行内容ですが、「読み込んだ行の3番目のフィールドが70以上だったら(英語が70点以上だったら)xに2番目のフィールドの値を加えなさい」ということです。

AWKはファイルを読み込ませると自動的に1行ずつ読み込んでいくようになっています。このとき、英語が70点以上なのは Hanako と Yumiko で、この時だけ国語の点をxに加えるのですから、82点+68点で、合計150点になるというわけです。

パターン[編集]

BEGINとEND[編集]

BEGINとENDではじまるブロックはプログラムの最初と最後に必ず実行されます。BEGINは入力を読み込む前(「処理系に触れてみる」で言うとstudent.dataを読み込む前)に実行される部分です。また、ENDは全ての入力が終わった後に実行されます。

複数のBEGINやENDがある場合、それらが記述されている順に実行されます。必ずそうする必要はありませんが、習慣的にBEGINは最初に、ENDは最後に記述します。

アクション[編集]

ユーザ定義関数[編集]

出力[編集]

単純に読み込んだ行を全て出力するだけなら

{ print }

とすれば済みます。

$ の後に数字をつけると特定のフィールドを指定できることをすでに学びましたが、皆さん思えていますか? ではもし $0 としたら、これは何を意味するのでしょうか? 実は、レコード全体(行全体)のことを表します。ですから、

{ print $0 }

としても読み込んだ行を全て出力します。

入力[編集]

シェルコマンドの使い方[編集]

参考リンク[編集]

このページ「AWK」は、まだ書きかけです。加筆・訂正など、協力いただける皆様の編集を心からお待ちしております。また、ご意見などがありましたら、お気軽にトークページへどうぞ。