Я написал (сомнительный) фрагмент кода для определяемой пользователем средней функции, где код принимает второй аргумент вызова командной строки, использует соответствующее поле во входном файле и находит среднее значение всех этих полей. (в единственном столбце).
Входной файл называется player.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
Моя функция должна, в зависимости от второго аргумента при вызове, найти среднее из 5 чисел в третьем, четвертом или пятом столбец (поле).
Таким образом, данный вызов nawk -f testscript2.script player.data Row3
должен использовать Row3 как ARGV [2]
, и, таким образом, согласно приведенной ниже строке суммы 3 оператора if в Players.data
и, таким образом, выводит Среднее значение строки Row3 составляет 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 }
Как мог этот код быть исправлено таким образом, чтобы при передаче вышеуказанного вызова отображался желаемый результат?
у Вас есть одно дополнительное {
перед строкой с 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]
когда вызов функция: 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
и наконец делится на количество строк.