awk -f [スクリプト] [データ1] [データ2] ...この場合、まず [データ1] が先頭から最後まで読み込まれて処理され、 次に [データ2] が読み込まれて処理され、という風に処理が進みますから、 結局データファイルをすべてつなげて awk に処理をさせている、つまり
cat [データ1] [データ2] ... | awk -f [スクリプト]と同等の処理をしていると見ることもできますが、 暗黙の大域変数の中には各ファイル毎の情報を持つものもあって、 この2つの処理方法では実際に異なる点もあります。 ●FILENAME : 現在処理中のデータファイルのファイル名 ●FNR : 現在処理中のデータファイルの先頭からの行番号 ●NR : 全データファイル通しての先頭からの行番号 ●ARGIND : 現在処理中のファイルのインデックス これを利用すると、 データファイルが切り替わったことを知って 処理の内容をそれに合わせて変更する、 などということも可能になりますが、今回はそこまでは必要ありません。 ファイルのインデックスというのは、引数の何番目か、 ということを意味します。 AWK の引数は、AWK 自身へのオプション指定と データファイルの指定部分に分けられますが、 AWK 自身へのオプション以外の部分、 つまり (主に) データファイルの指定部分の引数は、C言語のように ARGV という配列、ARGC という変数に保存されています。 ●ARGC : コマンド名自体と AWK 自身へのオプション以外の引数の個数 ●ARGV : それらを文字列として保存する配列 (ARGV[0]
awk -f test.awk -v s=3 file1 file2の場合は
-f test.awk
と -v s=3
は
AWK 自身へのオプションなので ARGC = 3 であり、
ARGV[0]="awk", ARGV[1]="file1", ARGV[2]="file2"となります。以下のようなスクリプトを test.awk として、 file1, file2 を 2,3 行のファイルとして 実際に上のように実行してみればこれらがなんとなくわかると思います。
# 暗黙の大域変数テスト BEGIN{ for(j=1;j<=ARGC;j++) printf "ARGV[%d]=%s\n",j-1,ARGV[j-1] } { printf "(FILENAME,FNR,NR,ARGIND)" printf "=(%s,%d,%d,%d)\n",FILENAME,FNR,NR,ARGIND }多分、結果は以下のようになります。
ARGV[0]=awk ARGV[1]=file1 ARGV[2]=file2 (FILENAME,FNR,NR,ARGIND)=(file1,1,1,1) (FILENAME,FNR,NR,ARGIND)=(file1,2,2,1) (FILENAME,FNR,NR,ARGIND)=(file1,3,3,1) (FILENAME,FNR,NR,ARGIND)=(file2,1,4,2) (FILENAME,FNR,NR,ARGIND)=(file2,2,5,2) (FILENAME,FNR,NR,ARGIND)=(file2,3,6,2)今回取得するタイトルや日付データは、 先頭のファイルからのみ取得すればいいので、 それは ARGIND が1のときにだけ取得すればいいことになります。