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: myfile
myfile 中的每一行打印一次。如果 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:
。