AWK - 如何使用函数计算文件中的所有数字

AWK - 如何使用函数计算文件中的所有数字

我有点困惑,因为如果我不使用函数,我的模式就可以工作。但另一方面却并非如此。

输入文件:

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将计算与结果连接的字符0or 1(取决于当前行是否匹配)作为++number字符串。

A()由于您仅在块中调用函数ENDnumber因此只会递增一次,这就是为什么您总是得到1输出。

相关内容