如果我执行
echo "abcd" | awk '{print NR}'
返回1,这很好。
但是如果我创建一个包含内容的脚本文件script.awk
:
BEGIN{print NR}
并执行
echo "abcd" | awk -f script.awk
返回0.
为什么?
答案 0 :(得分:2)
您正在检查BEGIN
区块中的记录数量,但这不起作用。
为什么呢?因为在BEGIN
块中,文件尚未加载,既不是标准输入。
而是将其打印在END
块中。
$ cat a.wk
END {print NR}
$ echo "abcd" | awk -f a.wk
1
来自man awk
:
Gawk按以下顺序执行AWK程序。首先,所有 执行通过-v选项指定的变量赋值。下一个, gawk将程序编译成内部形式。然后,gawk执行 BEGIN规则中的代码(如果有的话),然后继续读取 ARGV数组中命名的每个文件(最多为ARGV [ARGC])。如果没有 在命令行上命名的文件,gawk读取标准输入。
答案 1 :(得分:0)
awk
计划遵循此计划:
CONDITION { ACTION(S) } NEXT_CONDITION { ACTION(s) }
您可以省略ACTION(S)
。在这种情况下,awk
将只打印当前记录。
BEGIN
只是一个特殊条件,在 awk开始读取输入之前是。仅供参考,还有一个END
条件,在 awk处理完所有输入行后
commanline脚本和放入文件的脚本的语法没有区别。
结论:
您可以简单地将其放入您的脚本中:
test.awk
{print NR}
并称之为:
awk -f test.awk <<< 'hello'