我有点困惑,因为如果我不使用函数,我的模式就可以工作。但另一方面却并非如此。
输入文件:
asd
111
22
3333
mike
44444
mas
我的 awk 函数:(它总是打印 1 而不是 4 )
function A(){
/[0-9]/ number++
print number
}
END{
A()
}
如果我在函数外部使用它,但在它内部总是打印1
,则模式可以工作,有什么问题?
答案1
/[0-9]/
通常不使用这样的模式里面一个块。它们更常用作
pattern { block }
如果您想针对函数内的字符串测试正则表达式,请使用match()
:
function A() {
if (match($0, "[0-9]"))
++number
}
{
A()
}
END {
print number
}
A()
这将通过调用每一行来计算包含至少一位数字的行数。该函数A()
会将[0-9]
正则表达式与该行的内容进行匹配,number
如果匹配则加一。该块在执行结束时END
打印结果。number
if (match($0, "[0-9]"))
您也可以使用来代替if (/[0-9]/)
,但match()
更灵活。
awk
这和程序的效果是一样的
/[0-9]/ { ++number }
END { print number }
如果您想计算仅包含正整数的行数(而不是包含某处数字的行数),请使用^[0-9]+$
as 正则表达式。
要点是A()
需要为每一行输入调用该函数,并且number
应该在块中打印变量的值END
。
下列句法被接受POSIXawk
语法,但是程序会不是计算包含数字的行数,但会计算行数。
function A() {
/[0-9]/ ++number
}
{
A()
}
END {
print number
}
该语句/[0-9]/ ++number
将计算与结果连接的字符0
or 1
(取决于当前行是否匹配)作为++number
字符串。
A()
由于您仅在块中调用函数END
,number
因此只会递增一次,这就是为什么您总是得到1
输出。