AWK脚本返回0条记录

时间:2015-11-11 14:44:37

标签: linux awk gawk

如果我执行

echo "abcd" | awk '{print NR}'

返回1,这很好。

但是如果我创建一个包含内容的脚本文件script.awk

BEGIN{print NR}

并执行

echo "abcd" | awk -f script.awk

返回0.

为什么?

2 个答案:

答案 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'