平均函数脚本代码中存在错误吗?

平均函数脚本代码中存在错误吗?

我为用户定义的平均函数编写了一段(可疑的)代码,其中代码采用命令行调用的第二个参数,并在输入文件中使用其各自的字段并找到所有这些字段的平均值(在单个列中)。

输入文件名为players.data

LBJ:1:1:1:1
KBB:2:2:2:2
KDD:3:3:3:3
PPP:4:4:4:4
LLO:5:5:5:5

我的函数应该根据调用时的第二个参数,找到第 3、第 4 或第 5 列(字段)中的 5 个数字的平均值。

因此给定的调用nawk -f testscript2.script players.data Row3应该使用 Row3 作为ARGV[2],因此根据下面的 if 语句对第 3 行求和players.data,从而输出The average of row Row3 is 5.00

错误代码如下:

BEGIN{FS = ":"}
{
function average(ARGV[2]){

    if(ARGV[2] == "Row3"){
            sumJan += $3
            avgJan = sumJan / 5
            printf "The average of row %-10s is %6.2f", ARGV[2], avgJan
            }
    else if(ARGV[2] == "Row4"){
            sumFeb += $4;
            avgFeb = sumFeb / 5
            printf "The average of row %-10s is %6.2f", ARGV[2], avgFeb
            }
    else if(ARGV[2] == "Row5"){
            sumMar += $5
            avgMar = sumMar / 5
            printf "The average of row %-10s is %6.2f", ARGV[2], avgMar
            }
    else{
            print "Error: Invalid Input"
            }
    }
}
{average(ARGV[2])
}

以下是当前错误的摘要:

nawk: a6c.script: line 8: syntax error at or near function
nawk: a6c.script: line 15: syntax error at or near else
nawk: a6c.script: line 20: syntax error at or near else 
nawk: a6c.script: line 25: syntax error at or near else
nawk: a6c.script: line 28: syntax error at or near }

如何修复此代码,以便在传递上述调用时显示所需的输出?

答案1

第一、语法错误

{在该行之前还有一个额外的内容function

BEGIN{FS = ":"}
{
function average(ARGV[2]){
   ...
}

所以应该是:

BEGIN{FS = ":"}
function average(ARGV[2]){
   ...
}

然后,你正在创建一个接收参数的函数。这个参数应该只具有函数的本地作用域,因此调用它ARGV[2]只是对作用域的极大误解。只需使用类似的东西:

function average(row) {

    # things with the variable row

}

你使用ARGV[2]when呼叫功能:average(ARGV[2])

然后,概念错误

您正在使用每次迭代时调用的函数来计算平均值。如果您想使用函数,请使用一个函数来跟踪值,最后打印这些值。

此外,您在所有条件中重复了一堆代码if - else if - else。请注意,您可以说$4,也可以说var=row然后使用$var来使用rowth的值:

if(ARGV[2] == "Row3"){
            sumJan += $3
            avgJan = sumJan / 5
            printf "The average of row %-10s is %6.2f", ARGV[2], avgJan
            }

可以是通用的:

sum += $row
avg = sum / 5
printf "The average of row %-10s is %6.2f", row, avgJan

总的来说,这可以是一句简洁的话

$ awk -F: -v col=4 '{sum+=$col} END {print sum/NR}' file
3

这将保留列数的总和col并最后除以行数。

相关内容