awk:空のファイルに埋め込まれたFILENAME変数

awk:空のファイルに埋め込まれたFILENAME変数

awk入力が空のファイルのときにFILENAME変数が何も返さないのはなぜですか?awkファイルを開くことができないという意味ですか?開いていない場合は空であることをどうやって知ることができますか?または、開いているとファイル名を返さないのはなぜですか?

私は読んだこの投稿ただし、次の作業が必要な理由は説明しません。

awk 'BEGINFILE{print FILENAME}1' filename

以下はありません。

awk '{print FILENAME}' filename #or
awk 'BEGIN{print FILENAME}' filename

答え1

awkマニュアルから:

FILENAME  A  pathname  of  the  current input file.
Inside a BEGIN action the value is undefined.  (...)

それが説明だと思います。フィールドが処理されるまで値はFILENAME定義されません。空のファイルの場合、フィールドは処理されないため、変数は初期化されていません。

答え2

注:この回答の一部はawk特にGNUに固有のものです。4.0後で追加BEGINFILE/ENDFILE

一行にブロック

awk '{print "File name: " FILENAME}' myfile

これはFile name: myfilemyfile の各行ごとに 1 回印刷されます。 myfileが空のファイル(0バイト)の場合、行は含まれないため、上記の文字列はまったく印刷されません。

BEGINFILE詰まった

awk 'BEGINFILE{print "File name: " FILENAME}' myfile

サポートされている場合は、File name: myfile行が処理される前に一度印刷されます。

それ以外の場合、サポートされていない場合はBEGINFILE偽の条件式で処理され、まったく出力されない可能性があります。

BEGIN詰まった

awk 'BEGIN{print "File name: " FILENAME}' myfile

このブロックの評価はファイルが処理される前に発生し、この時点のFILENAME値は次のとおりです。限定されない

これgawk文書具体的に定義して""印刷することがわかりますFile name:

関連情報