AWK プログラムへの入力     Last modified: Dec 02, 2015

 AWK プログラムの入力は,キーボード,ファイル,または,他のコマンドからのパイプである。

AWK は,複数の入力元がある場合でも一つずつ処理する。しかし,場合によっては getline を使って,複数の入力元からデータを入力することができる。

 入力はレコード単位に読み込まれる。デフォルトでは 1 レコードは 1 行のことが多いが,レコードは 組込み変数 RS で区切られるので RS に特定の文字を指定すれば,複数行が 1 つのレコードになることもある。
 現在処理中のファイルからそれまでに読み込んだレコード数は FNR に保持される。複数のファイルから入力する場合,次の新しいファイルからの入力を読み始めるたびに 0 にリセットされる。
 複数のファイルから入力する場合は,AWK の処理が始まってからそれまでに読み込んだレコード数は NR に保持される。

 入力されたレコードは,組込み変数 FS により,フィールドと呼ばれる単位に分解される。FS はデフォルトでは空白であるが,1 つ以上の連続する空白やタブも空白とみなされる。
 いくつのフィールドに分解されたかは 組込み変数 NF に保持される。

 フィールドは $1, $2, ..., $NF などのように参照される。$ の後には $(NF-1), i=3; …; $i のように,任意の式を書くことができる。$(NF-1)$NF-1 が異なるということは自明であろう。
 NF より大きな値を指定した場合は空文字列を返す。
 $0 は入力したレコードそのものを表す。

 空白などで区切られず,それぞれのフィールドが一定の桁位置にあるようなデータ(固定書式データ,fixed format data)の場合は,組込み変数 FIELDWIDTHS によりそれぞれのフィールドの桁数を指定して読み込むことができる。

 getline は特殊な入力関数で,初心者には勧めない。
 getline はレコードが見つかれば 1 を返し,ファイルの終わりに達したときには 0 を返す。もし,レコードの読み込み中になんらかのエラーが発生したり,ファイルがオープンできなかったりした場合には -1 を 返す。このとき AWKERRNO という組込み変数にエラーが発生したことを表わす文字列をセットする。
getline カレント入力ファイルからレコードを入力し,入力レコードはフィールドに分割される。
getline var レコードを変数 var に読み込む。入力レコードはフィールドには分解されない$0, NF, NR, FNR は変更されない。
getline < file 入力ファイル file からレコードを入力し,入力レコードはフィールドに分割され,NF$0, $1, ..., $NR は変更される。NR, FNR は変更されない。
getline var < file 入力ファイル file から変数 var にレコードを入力する。NF$0, $1, ..., $NR, NR, FNR は変更されない。
command | getline コマンド command の出力をパイプを通じて getline で受ける。レコードをフィールドに分割し,NF をセット して $0 を再計算する。このとき,NRFNR は変更されない。close(command) 処理が必要。
command | getline var コマンド command の出力をパイプを通じて getline に渡し,さらに変数 var に格納する。どの組み込み変数も変更されず,読み込んだレコードのフィールド分割も行われない。close(command) 処理が必要。

 もし同じファイル名や同じシェルコマンドが,AWK プログラムの実行中に 2 度以上 getline と一緒に使われた場合,ファイルのオープンやコマンドの実行は最初の 1 回だけ行われる。次に getline を使って読むときは同一のファイル,コマンドから別のレコードを読み込む。
 このため,もし同じファイルを再び最初から読み始めたいときや,シェルコマンドを再実行したいようなときには,close 関数により入力ファイルやパイプをクローズしなければならない。
 close 関数の引数にはファイルをオープンするときやコマンドを起動するときの文字列と同じにしなければならない。例えば,パイプを
   "sort -r names" | getline foo
のようにしてオープンしたならば,クローズは次のようにしなければならない。
   close("sort -r names")
 close 関数はクローズに成功すると 0 を返す。失敗した場合には 0 以外の値が返り,変数 ERRNO にエラーが起きたことを示す文字列がセットされる。


・ 直前のページへ戻る  ・ E-mail to Shigenobu AOKI