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

注意:这个答案的部分内容特定于 GNU awk,特别是4.0后来又添加了BEGINFILE/ENDFILE

每行块

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

这将为File name: myfilemyfile 中的每一行打印一次。如果 myfile 是一个空白文件(零字节),它将不包含任何行,因此上面的字符串根本不会被打印。

BEGINFILE堵塞

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

如果支持,这将File name: myfile在处理任何行之前打印一次。

否则,如果不支持,它可能会被视为BEGINFILE虚假条件表达式,并且根本不打印任何内容。

BEGIN堵塞

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

该块的评估发生在处理任何文件之前,此时 的FILENAME值为没有定义的

gawk文档特别定义它"",所以我们可以知道它只会打印File name:

相关内容