awk中用户定义的函数问题

时间:2015-02-26 06:56:21

标签: bash unix awk

我的代码1:

awk -F'|' -v PARM_VAL="${PARM_VALUE[*]}" '
BEGIN { split(PARM_VAL,pa," ") 
fn_1()
{
print "inside fn"
}
}
FNR==NR{ for(i=1;i<=NF;i++) a[NR,i]=$i; }

{if (FILENAME == "SPP_OUT") {print $1}}
fn_1 
END {printf " second value of SPPIN : "a[2,2]} ' SPP_IN SPP_OUT

我收到错误致命:函数`fn_1'未定义

我的代码2:

awk -F'|' -v PARM_VAL="${PARM_VALUE[*]}" '
BEGIN { split(PARM_VAL,pa," ") 
fn_1()
{
ret = "returned"
return ret
}
}
FNR==NR{ for(i=1;i<=NF;i++) a[NR,i]=$i; }

{if (FILENAME == "SPP_OUT") {print $1}}
m=fn_1()
END {printf " second value of SPPIN : "a[2,2];print $m} ' SPP_IN SPP_OUT

我正面对 awk:cmd。第6行:返回ret awk:cmd。 line:6:^`return'在函数上下文中使用

任何助手都可以吗? 感谢

2 个答案:

答案 0 :(得分:3)

应该在BEGIN块之外定义该函数。例如:

$ cat function.awk
function fib(n,  n_1, n_2)
{
    if (n < 2) {
        return n
    } else {
        n_1 = fib(n - 1)
        n_2 = fib(n - 2)
        return n_1 + n_2
    }
}

BEGIN {
    for (i = 0; i < 5; ++i) {
        printf("fib(%d) = %d\n", i, fib(i));
    }
}
$ awk -f function.awk
fib(0) = 0
fib(1) = 1
fib(2) = 1
fib(3) = 2
fib(4) = 3
$

用户定义的awk函数语法为

function NAME(PARAMETER-LIST)
{
    BODY-OF-FUNCTION
}

棘手的部分是:

  

PARAMETER-LIST是函数的参数和局部变量的列表   名称,以逗号分隔。调用函数时,参数   名称用于保存调用中给出的参数值。的的   局部变量初始化为空字符串。一个功能不能   有两个具有相同名称的参数,也可能没有参数   与函数本身同名。

有关详细信息,请参阅awk manual

答案 1 :(得分:2)

为了使代码的核心工作,我必须在定义函数时添加function关键字,并在进行调用时添加括号:

$ cat foo.awk
BEGIN { print "begin" }

function fn_1()
{
  print "inside fn"
}

{
    fn_1()
}

END { print "end" }

$ echo 'xyz' | awk -f foo.awk
begin
inside fn
end

来自awk手册:

  

名为name的函数的定义如下所示:

     

功能名称(参数列表)
  {
     身体的功能
  }