11

我正在编写一个开始的 gawk 脚本

#!/bin/gawk -f
BEGIN { print FILENAME }

我通过调用文件,./script file1.html但脚本什么也不返回。有任何想法吗?

4

4 回答 4

14

如果你真的想在 BEGIN 块中使用它,你可以使用 ARGV[1] 而不是 FILENAME

awk 'BEGIN{print ARGV[1]}' file
于 2011-03-26T13:52:42.003 回答
10

遇到第 1 行时可以打印文件名:

FNR == 1

如果你想不那么神秘,更容易理解:

FNR == 1 {print}

更新

我的前两个解决方案不正确。谢谢丹尼斯指出。他的方法是正确的:

FNR == 1 {print FILENAME}
于 2011-03-26T16:48:56.843 回答
7

直接来自手册页(稍微重新格式化):

FILENAME:当前输入文件的名称。如果命令行中没有指定文件,则 FILENAME 的值为“-”。但是,FILENAME 在 BEGIN 块内未定义(除非由 getline 设置)。

于 2011-03-26T11:44:45.820 回答
1

基于 Hai Vu 的回答,我建议如果您只希望每个文件打印一次文件名,则需要将其包装在条件中。

if(FNR == 1) { print FILENAME };
于 2016-04-17T23:21:17.900 回答