我为用户定义的平均函数编写了一段(可疑的)代码,其中代码采用命令行调用的第二个参数,并在输入文件中使用其各自的字段并找到所有这些字段的平均值(在单个列中)。
输入文件名为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
来使用row
th的值:
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
并最后除以行数。