スクリプトの実行順序 (その 6) next と exit

awk のスクリプトには:

BEGIN{アクション}

パターン 1 {アクション}
パターン 2 {アクション}
パターン 3 {アクション}
...

END{アクション}

exit 文

exit 文は全ての処理を中止し (つまり, 入力データを全て読み終えて処理をしたかのように) 最後の END 部を実行する. END 部がなければ, そのまま実行は終了する.

次のスクリプトは, ファイルの中で, “word” という綴りの出現する行数をカウントして, 50 回を超えたら, ファイル名を出力して, 処理を終了する:

/word/{
  times++ # 入力行に word という綴りが出現するたびに times はインクリメント
  if(times > 50){
    print FILENAME # FILENAME は組み込み変数で入力ファイルをフルパスで表す
    exit
  }
}

next と getline

scpt15_3.awk

#!/usr/local/bin/gawk -f
# scpt15_3.awk

/東京/{
    print "東京出身だね"
    if(getline == 0) # ファイルの終わりの場合の処理
	exit
}

/大阪/{
    print "大阪出身やね"
}

/名古屋/{
    print "名古屋出身だがや"
}

scpt15_3.awk の実行結果は:

[cactus:~/code_awk/tuts]% ./scpt15_3.awk data15_1.txt
東京出身だね
大阪出身やね
名古屋出身だがや
東京出身だね
大阪出身やね
名古屋出身だがや

東京人が 2 回, 大阪人, 名古屋人がそれぞれ 2 回ずつ登場する. このスクリプトではファイルの 1 行目については /東京/ のパターンマッチに合格して, 最初のアクションが実行される. しかし, そのアクションの中で getline を実行し, ファイルの 2 行目を読み込む. この 2 行目に関しては /東京/ のパターンマッチングは行われない. 次の /大阪/ のパターンマッチング と /名古屋/ のパターンマッチングが行われ, それぞれ print 文が実行される. そのあと 3 行目が新たに読み込まれるが, ファイルの 1 行目の時と同様に, /東京/ のパターンマッチングに合格し, print 文が実行されるが, そのあとの getline で 4 行目が読みこまれる. これに対しては, /大阪/ と /名古屋/ のパターンマッチングが行われる. 5 行目はないのでこれで終了する.

Table Of Contents

Previous topic

スクリプトの実行順序 (その 5) for 文

Next topic

awk の配列