awkで読み込めないファイルを読み飛ばす

knowhow

awk(gawk)でファイルを読み込めない場合、致命的なエラーとして扱われ、awkのスクリプトの処理が即時に終了してしまいます。awkで複数のファイルを処理したいときに、途中でawkの処理が終了すると困る場合があります。そのような時はBEGINFILEと変数ERRNOを用いると、ファイルが読み込めない場合、そのファイルを読み飛ばすような処理を行うことができます。

スポンサーリンク

BEGINFILEについて

awkの処理の流れは、処理の開始時にBEGINでの処理を行い、その後にファイルを読み込むごとに、BEGINFILEでの処理->特別なパターン以外のawkの処理->ENDFILEでの処理 のように繰り返し処理を行い、最後にENDでの処理を行って終了します。

BEGINFILEはファイルを読み込むごとに、それぞれ1回だけ最初に処理が実行されます。

変数ERRNO

変数ERRNOはawkの組み込み変数でgetlineやcloseの操作を行った際、システムエラーが発生したときにエラーの内容が入る変数です。

さらにファイルを読み込む前に値が消去されるので、BEGINFILEで利用するとファイルを読み込んだときにエラーが起きたかどうかを確認できます。

ファイルが読み込めない場合にそのファイルを飛ばす

awkで複数のファイルを処理したいときにファイルを読み込むことができない場合、致命的なエラーが起きて、その読み込めないファイルで処理が途中で停止するときがあります。

エラーが起きた場合の例

そのような場合は、BEGINFILEと変数ERRNOを組み合わせると以下のようにファイルが読み込めないときにそのファイルを飛ばすことができます。awkで行う処理としてはawkで読み込んだ行数とファイルの内容を表示しています。

file1.txtとfile2.txtとfile3.txtの権限とその内容

script.awk

コマンド例と実行結果

変数NRはawkで処理した行数を記録している組み込み変数になります。
また、awkのif文の条件は0とヌル文字列以外は真になります。
ERRNOの値はファイルが読み込まれる前に消去されます。上の例ではファイルが読み込めない場合はERRNOに何らかの値が入るため、nextfile文で次のファイルに処理が移行するような処理になっています。

このときのファイルが読み込めない場合のERRNOの値は以下のようになっています。

また、上のファイルの内容を表示する処理のワンライナーの形式として、以下のように記述できます。

参考

awkはパターンマッチやテキスト処理が得意なプログラミング言語です。awkはプログラムのコンパイルが必要ないインタプリタ言語...

Gawk: Effective AWK Programming

スポンサーリンク