移動先 先頭, , , 末尾 セクション, 目次.

組み込み変数

大部分のawkの変数はユーザが好きに使うことができる。そういった変数は自 分で代入をしない限り値が変わるようなことはないし、プログラムに対して何か影響 を与えるということもない。 しかし、awkの一部の変数は特別な組込みの意味を持っている。 その変数の一部はawkが自動的にその値を評価する。そのような変数を操 作することによって、 awkプログラムの動作を操作することが可能である。 他の変数はawkがその値を自動的にセットする。それを参照すること によってプログラム中でawkがどのように働いているのかについて情報を得る ことができる。

この章ではgawkの組み込み変数について説明する。組み込み変数の多くは、 それが実際に使われている章でも説明されている。

Built-in Variables that Control awk

以下のリストは、変更することによりawkの挙動を変更することのできる 変数のリストである。アスタリスク `*'がついている変数は gawkに特有のものである。

CONVFMT
この変数に格納されている文字列は数値から文字列に変換 (セクション Conversion of Strings and Numbersを参照). する際にawkが使用する (セクション Built-in Functions for String Manipulationを参照)。 この変数は参照されたときに、sprintfの第一引数であるような効果を持つ。 デフォルトでは"%.6g"という値になっている。 CONVFMTは POSIX の標準によって導入された。
FIELDWIDTHS *
これは gawkに対して、固定したカラム境界で入力を扱うように指示するカラ ムのリストで、リストの個々の要素はスペースで区切られている。また、これは 実験的な機能である。 FIELDWIDTHSに対する代入はフィール ド分割の為のFSの使用をオーバーライドする。より詳しくは、 セクション 固定長データの読み込みを参照。 互換モードでgawkが起動された場合 (セクション コマンドラインオプションを参照),、FIELDWIDTHSは 特別な意味を持たず、フィールド分割の処理はFSの値によってのみ 行われる。
FS
FSは入力フィールドセパレータである (セクション フィールドの分割方法の指定を参照)。 その値は一文字の文字列、もしくは複数の文字で構成される正規表現 で、入力レコードをフィールドに分割するときの分割部分にマッチする。 FSに空文字列("")をセットすると、 レコード中のキャラクタ一文字をフィールド一つとして分割を行う。 デフォルトの値は" "で、一つのスペースからなる文字列である。例外と して、この値は連続しているスペース、タブ、改行を一つのセパレータとして(9) 認識させ、行の先頭や終端にあるスペース、タブの連続を無視させる。 `-F'オプションを使うことにより、コマンドライン上で FSの値を変更 することが出来る。
awk -F, 'program' input-files
gawkがフィールド分割をFIELDWIDTHSを使用して行っているときに FSに値を代入すると、gawkは通常の正規表現によるフィールド分割を 行う状態に戻る。これはただ単純に`FS = FS'としても同じ結果となる。
IGNORECASE *
IGNORECASEが非0であるとき、 全ての文字列比較は大小文字を無視して行われる。 このため、 `~'`!~'を使った正規表現のマッチング、 gensub, gsub,index,match, split ,subといっ た関数の正規表現マッチング、RSによるレコードの区切り、FSを 使ったフィールド分割は全て大小文字を無視して行われる。 IGNORECASE の値は配列の添え字付けには何の影響も及ぼさない。 セクション 大小文字を区別するマッチングを参照。 gawkが互換モード (セクション コマンドラインオプションを参照) で動作しているときは、 IGNORECASE は特別な意味を持たず、正規表現は常に大小文字を区別して マッチングが行われる。
OFMT
この文字列はawkprint文で出力を行うときに、数値を文字列に変 換するときの動作を制御するのに使用される (セクション Conversion of Strings and Numbersを参照) 。この変数は参照されたときに、sprintf (セクション Built-in Functions for String Manipulationを参照) の第一引数であるような効果を持つ。デフォルトでは"%.6g"という値に なっている。初期の awkではOFMTを、数値から文字列に変更するような全ての式で書式を 特定するために使っていたが、その役割は現在ではCONVFMTが果たしている。
OFS
出力フィールドのセパレータ (セクション Output Separatorsを参照)、 print文を使ったときにフィールドとフィールドの間に出力される。 デフォルトは" "(一つのスペースからなる文字列)である。
ORS
出力レコードのセパレータ。 print文で出力したときに最後に(付加されて) 出力される。デフォルトは改行コード一つからなる文字列である("\n"とい う文字列)。 (セクション Output Separatorsを参照.)
RS
これはawkに対する入力のレコードセパレータである。デフォルト値は改行キャ ラクタである。つまり、デフォルトでは入力レコードはテキスト中の一行である これは空文字列や正規表現であってもよく、空文字列場合は、レコードは空行の 連続によって区切られ、正規表現の場合にはその正規表現にマッチした 入力テキストによって区切られる。 (セクション 入力をレコードへと分割をするやりかたを参照.)。
SUBSEP
SUBSEPは添字を区切るものであり、そのデフォルトの値は"\034"であ る。この値は多次元配列の名前を分割するために使われる。したがって foo["A","B"]と記述すると、実際はfoo["A\034B"] にアクセスする (セクション Multi-dimensional Arraysを参照)。

情報を伝達する組込み変数

以下のリストはawkによって自動的に値がセットされ、プログラム中で情報を得る ことのできる変数のリストである。gawkに特有の変数には アスタリスク `*'が目印についている。

ARGC
ARGV
awkプログラムに対するコマンドライン引数は、ARGVと呼ばれる 配列に格納される。ARGCにはコマンドライン引数の数が格納される。 セクション Other Command Line Argumentsを参照. 大部分のawkの変数とは異なり、ARGVの添え字付けは 0からARGC - 1である。たとえば、
$ awk 'BEGIN {
>        for (i = 0; i < ARGC; i++) 
>            print ARGV[i] 
>      }' inventory-shipped BBS-list
-| awk
-| inventory-shipped
-| BBS-list
この例では、ARGV[0]には"awk"が、ARGV[1]には "inventory-shipped"が、ARGV[2]には"BBS-list"が 入っている。ARGVの値は3であり、それはARGVの最大のインデック スよりも一つ大きい。それは、インデックスを0から数えるからである。 ARGCARGVの名前と、その添え字付けがゼロからARGC @minus 1 であるということはC言語で使われているコマンドライン引数の取り扱い方法から きている。awkがこれらの変数をどのように使うかは セクション Using ARGC and ARGVを参照。
ARGIND *
現在処理を行っているファイルのAEGVにおけるインデックス。 gawkは新しいファイルをオープンする度に、 AERGINDに処理するファイル名のあるARGVの インデックスをセットする。 awkがファイルを処理している間は、 `FILENAME == ARGV[ARGIND]'は常に真である。 この変数はファイル処理に便利である。データファイルのリスト中でリスト中のどこ のファイルであるかを知ることができるし、コマンドライン上で同じ名前で指定され ている複数のインスタンスを区別することができる。 awkプログラム中でARGINDの値を変更することができ、それにより gawkは自動的に次のファイルをオープンするときに新しい値をセットする。 この変数はgawkの拡張である。ほかのawkや、gawkが互換モード (セクション コマンドラインオプションを参照)で動作している場合は特殊変数ではない。
ENVIRON
環境変数の値で構成される連想配列である。配列は環境変数の名前で添字付けされ る。要素の値は各環境変数の値である。例えば、 ENVIRON["HOME"]の値は `/home/arnold/'である。この配列の要素を変更しても awkがリダイレ クションやsystem関数で起動する他のプログラムに渡される環境変数その ものには影響しない (これは将来のgawkでもこのように動作するだろう)。 一部のオペレーティングシステムでは環境変数を備えていないものがある。 このようなシステムの場合、配列ENVIRONは空である (ENVIRON["AWKPATH"]を除く)。
ERRNO *
getlineのリダイレクト、getlineでの読み込み、 closeでシ ステムエラーが発生したときにERRNOにはエラーを表わす文字列がセットされ る。 この変数はgawkの拡張である。ほかのawkや、 gawkが互換モード(セクション コマンドラインオプションを参照) であるときは特殊変数ではない。
FILENAME
この変数にはawkが現在読み込んでいるファイルのファイル名がセットされて いる。 awkが標準入力から(言い替えればコマンドラインでファイル名が与 えられていなければ)入力を行っている場合には FILENAME"-"が セットされる。 FILENAME は新しくファイルが読み込まれる度に変更される (セクション 入力ファイルの読み込みを参照). BEGINルールの中では入力ファイルがまだ処理されていないので、 FILENAMEの値は""である。(10)(d.c.)
FNR
FNRには、現在処理しているファイルでの、カレントレコードの番号が セットされている。FNRはレコードの入力の度に更新される (セクション getlineを使った入力を参照)。 入力ファイルが新しくなる度に0に初期化される。
NF
NFにはカレントレコード中のフィールドの数が格納されている。 NF はレコードの入力が行われて新しいフィールドが作られたとき、もしくは$0 が変更される度に更新される (セクション フィールドの検査を参照)。
NR
NR is set each time a new record is read. この変数にはプログラムが実行開始してからそれまでに入力されたレコードの数が格 納されている(セクション 入力をレコードへと分割をするやりかたを参照)。 NR は新しいレコードが入力される度に更新される。
RLENGTH
RLENGTHにはmatch関数でマッチした部分文字列の長さが格納されてい る(セクション Built-in Functions for String Manipulationを参照)。 RSTARTmatch関数を起動するとセットされ、マッチする部分文字列 があればその部分文字列の長さが、ない場合には-1が格納される。
RSTART
RSTARTmatch 関数でマッチした部分文字列の最初のキャラクタの インデックスが入る (セクション Built-in Functions for String Manipulationを参照)。 RSTARTmatch関数を起動するとセットされ、マッチする部分文字列 があればその開始位置が、ない場合には0が格納される。
RT *
RTはレコードが読み込まれるたびにセットされる。この変数は、 RSで指定されるテキストにマッチした レコードセパレータである入力テキストを保持している。 この変数はgawkの拡張であり、他のawk処理系や、gawk が互換モード(セクション コマンドラインオプションを参照)で動作しているときには 特殊変数ではない。

NRFNRに関するちょっとしたメモ。

awkはレコードを読み込む度に、読み込んだレコードの数そのものをこれ らの変数にセットするのではなく、これらの変数を単純にインクリメントする。 これは、あなたがプログラム中でこれらの変数の値を書き換えることができると いうことであり、それ以後はレコードを読み込む度にその値をインクリメントし ていくのである(d.c.)。例を挙げると

$ echo '1
> 2
> 3
> 4' | awk 'NR == 2 { NR = 17 }
> { print NR }'
-| 1
-| 17
-| 18
-| 19

のようになるのである。

FNRawk言語に追加される以前 (セクション Major Changes between V7 and SVR3.1を参照)には、 多くのawkプログラムでファイルごとのレコード数を記憶するのに、 FILENAMEが代わる度にNRを0にリセットする ということでこの仕様を利用していた。

Using ARGC and ARGV

セクション 情報を伝達する組込み変数を参照では、 ARGCARGVに格納されている情報に関する説明を行っている。

$ awk 'BEGIN {
>        for (i = 0; i < ARGC; i++) 
>            print ARGV[i] 
>      }' inventory-shipped BBS-list
-| awk
-| inventory-shipped
-| BBS-list

この例では、ARGV[0]には"awk"が、ARGV[1]には "inventory-shipped"が、そしてARGV[2]には "BBS-list"がセットされている。

awkプログラムはARGVには含まれていない。 その他の引数を伴った特殊なコマンドラインオプションも含まれていない。 しかし、コマンドライン上での変数代入は引数として扱われる 。これには`-v'オプションによって 代入された変数も含まれる(セクション コマンドラインオプションを参照)。 コマンドライン上にある通常の変数代入は引数として扱われ、 こういったものはARGV配列に含まれている

$ cat showargs.awk
-| BEGIN {
-|     printf "A=%d, B=%d\n", A, B
-|     for (i = 0; i < ARGC; i++)
-|         printf "\tARGV[%d] = %s\n", i, ARGV[i]
-| }
-| END   { printf "A=%d, B=%d\n", A, B }
$ awk -v A=1 -f showargs.awk B=2 /dev/null
-| A=1, B=0
-| 	ARGV[0] = awk
-| 	ARGV[1] = B=2
-| 	ARGV[2] = /dev/null
-| A=1, B=2

プログラム中でARGCARGVを変更することができる。 awkは入力ファイルの終端に達する度に、ARGVの次の要素を 次の入力ファイルのファイル名として扱う。 そこに異なる文字列を格納することによって、読み込むファイルを変更する ことができる。このとき、標準入力は"-"で表わすことができる。 新しい要素を追加し、ARGCをインクリメントすることによって、 読み込むファイルを増やすことができる。

ARGCの値をデクリメントすると、リストの最後にある 入力ファイルがリストから削除される。ARGCの古い値を 他の場所で使うことにより、リストから削除された引数を ファイル名以外のものとして使うことができるようになる。

リストの中程にあるファイルをリストから削除するには、 空文字列("")を対象となるファイルの名前が格納されている ARGVの要素に代入してしまえば良い。 特殊な仕様として、awkは 空文字列に置き換えられたファイル名を無視する。 同様に、ARGVからある要素を削除するためにdelete 文を使うこともできる(セクション The delete Statementを参照)。

これらのアクションは、典型的には入力に対して何等かの処理が行われる前、 BEGINルール中で行われる。 セクション 大きなファイルを分割するを参照。 また、ARGVから要素を削除するやり方は セクション 出力を複数のファイルに複製するを参照。

以下のコード片はARGVを順番に確認し、そこからコマンドラインオプションを 削除する処理をしている。

BEGIN {
    for (i = 1; i < ARGC; i++) {
        if (ARGV[i] == "-v")
            verbose = 1
        else if (ARGV[i] == "-d")
            debug = 1
        else if (ARGV[i] ~ /^-?/) {
            e = sprintf("%s: unrecognized option -- %c",
                    ARGV[0], substr(ARGV[i], 1, ,1))
            print e > "/dev/stderr"
        } else
            break
        delete ARGV[i]
    }
}

awkプログラムにオプションを渡すために、awkに対する オプションの末尾に`--'を与えて、その後にawkプログラム に対するオプションを、以下に示す例のようにして置かなければ ならない。

awk -f myprog -- -v -d file1 file2 ...

これはgawkでは不要である。`--posix'オプションが指定され ないかぎり、gawkは認識できないあらゆるオプションに対して なんのメッセージも出さずにそのままARGVへと格納し、 awkプログラムはそういったオプションを取り扱えるのである。

As soon as it 知らないオプションを発見すると、gawkは即座にオプション解析を やめて、その後に認識できるオプションがあってもそれをgawkに 対するオプションとして解析することはない。

gawk -f myprog -d -v file1 file2 ...

上記の例に対してgawkは、`-d'が正当なオプションでないので `-v'awkプログラムにそのまま渡すのである。


移動先 先頭, , , 末尾 セクション, 目次.