Ошибки в коде скрипта функции усреднения? [закрыто]

Я написал (сомнительный) фрагмент кода для определяемой пользователем средней функции, где код принимает второй аргумент вызова командной строки, использует соответствующее поле во входном файле и находит среднее значение всех этих полей. (в единственном столбце).

Входной файл называется 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 }

Как мог этот код быть исправлено таким образом, чтобы при передаче вышеуказанного вызова отображался желаемый результат?

0
задан 2 November 2016 в 11:02

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] когда вызов функция: 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 и наконец делится на количество строк.

3
ответ дан 28 September 2019 в 06:44

Другие вопросы по тегам:

Похожие вопросы: