次へ: 4 タイトルと日付の取得 上へ: AWK による HTML ファイルの整形 その 2 前へ: 2 Yahoo! ニュース一覧の構造 (PDF ファイル: awkwww2.pdf)


3 複数のデータファイルの処理

今回は、複数のデータファイルを処理することになるわけですが、 AWK でそれを 1 ファイルずつ処理してもいいわけですが、 一度に複数のデータファイルを処理することも可能です。

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 のときにだけ取得すればいいことになります。


次へ: 4 タイトルと日付の取得 上へ: AWK による HTML ファイルの整形 その 2 前へ: 2 Yahoo! ニュース一覧の構造
竹野茂治@新潟工科大学
2006年9月5日