AWK に複数のデータファイルを処理させる場合は、 単にそれを並べて指定するだけです。
awk -f [スクリプト] [データ 1] [データ 2] ...この場合、まず [データ 1] が先頭から最後まで読み込まれて処理され、 次に [データ 2] が読み込まれて処理され、という風に処理が進みますから、 結局データファイルをすべてつなげて awk に処理をさせている、つまり
cat [データ 1] [データ 2] ... | awk -f [スクリプト]と同等の処理をしていると見ることもできますが、 暗黙の大域変数の中には各ファイル毎の情報を持つものもあって、 この 2 つの処理方法では実際に異なる点もあります。
ファイルのインデックスというのは、引数の何番目か、 ということを意味します。 AWK の引数は、AWK 自身へのオプション指定と データファイルの指定部分に分けられますが、 AWK 自身へのオプション以外の部分、 つまり (主に) データファイルの指定部分の引数は、 C 言語のように ARGV という配列、ARGC という変数に保存されています。
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 のときにだけ取得すればいいことになります。