awk 処理系は テキスト処理に特化した言語で、テキストフィルターを短くエレガントに記述することが出来ます。POSIX で標準化され多くの実装が存在します。この記事では awk 処理系の比較を行います。
awk の処理系
AWK の著名な処理系としては次の4つがあります。
- awk
-
A. Aho と B. W. Kernighan と P. Weinbergerによって書かれた オリジナルの AWK です。
- nawk
AT&T の 新しい(New) AWK 実装です。
- gawk
-
gawk は GNU awkの省略で、AWK 言語の POSIX 1003.2 (draft 11.3) 定義に準拠しています。 gawk は Gnu 独自の拡張も提供します。gawk は Linux の標準的な実装となっています。
- mawk
-
マイク・ブレナンによる AWK の実装で、AWK 言語の POSIX 1003.2 (draft 11.3) 定義に準拠しています。 また、mawk はいくつかの 拡張を提供します。この実装はバイトコードでインタプリタで動作します。mawk は gawk よりも小さく2倍くらい速く、CやC++言語のネイティブ実装と同程度に高速に動作します。
プログラミング上の差異
ビルトイン変数の比較
変数 | nawk | gawk | mawk |
---|---|---|---|
ARGIND | No | Yes | No |
BINMODE | No | Yes | Yes |
ERRNO | No | Yes | No |
FIELDWIDTHS | No | Yes | No |
IGNORECASE | No | Yes | No |
LINT | No | Yes | No |
- ARGIND
現在処理中のファイル名が格納されている ARGV 配列のインデックス。
- BINMODE
この変数はすべての入出力においてバイナリモードを使うことを指定します。この変数はgawkの拡張です。
- ERRNO
getline のリダイレクト、 getline による読み込み、 close() 関数の実行時のいずれかにシステムエラーが発生した場合、変数 ERRNO にはエラーの内容を示した文字列が設定されます。
- FIELDWIDTHS
この変数は空白で区切られたフィールド長のリスト文字列で、この値が設定されていれば、FS の値を用いてフィールド分割するかわりに固定長のフィールド分割を行います。この変数はgawkの実験的な拡張です。
- IGNORECASE
すべての正規表現と文字列操作において大文字小文字の区別を制御します。この変数はgawkの拡張です。
- LINT
この変数が真のとき、マンドラインオプション `–lint’ が指定されたときのように振舞う。この変数はgawkの拡張です。
ビルトイン関数の比較
関数 | POSIX AWK | nawk | gawk | mawk |
---|---|---|---|---|
asort() | No | No | Yes | No |
fflush() | No | Yes | Yes | Yes |
mktime() | No | No | Yes | Yes |
systime() | No | No | Yes | Yes |
strftime() | No | No | Yes | Yes |
gensub() | No | No | Yes | No |
- asort(source [, dest [, how ] ])
配列の要素を、昇順で並び替えます。
- fflush([file])
オープンされている出力ファイルまたはパイプ file に関連づけられているバッファをフラッシュします。
- mktime(datespec)
“YYYY MM DD HH MM SS”の文字列をUnix 時間に変換します。
- systime()
systimeはタイムスタンプをシステムが開始された時刻からの経過秒数として返す関数です。この時刻情報はstrftimeという 組込み関数を使用して任意の書式で出力することができます。
- strftime([format [, timestamp]])
systimeで取得したUnix時間を strftimeを使用して任意の書式で出力することができます。
- gensub(regexp, replacement, how [, target])
gensubは汎用的な置換関数です。sub() や gsub() とは異なり、置換された文字列が関数の結果として返され、入力テキストは変更されません。
POSIX 組み込み変数
- ARGC
- ARGV
- CONVFMT
- ENVIRON
- FILENAME
- FNR
- FS
- NR
- OFMT
- OFS
- ORS
- RLENGTH
- RS
- RSTART
- SUBSEP
POSIX 組み込み関数
- atan2(y,x)
- cos(x)
- sin(x)
- exp(x)
- log(x)
- sqrt(x)
- int(x)
- rand()
- srand([expr])
- gsub(ere, repl[, in])
- index(s, t)
- length[([s])]
- match(s, ere)
- split(s, a[, fs ])
- sprintf(fmt, expr, expr, …)
- sub(ere, repl[, in ])
- substr(s, m[, n ])
- tolower(s)
- toupper(s)
- close(expression)
- getline
- system(expression)