Используйте awk, чтобы найти среднее значение столбца
Я пытаюсь найти среднее значение для второго столбца данных, используя awk
для класса. Это мой текущий код, с каркасом, предоставленным моим инструктором:
#!/bin/awk
### This script currently prints the total number of rows processed.
### You must edit this script to print the average of the 2nd column
### instead of the number of rows.
# This block of code is executed for each line in the file
{
x=sum
read name
awk 'BEGIN{sum+=$2}'
# The script should NOT print out a value for each line
}
# The END block is processed after the last line is read
END {
# NR is a variable equal to the number of rows in the file
print "Average: " sum/ NR
# Change this to print the Average instead of just the number of rows
}
и я получаю сообщение об ошибке:
awk: avg.awk:11: awk 'BEGIN{sum+=$2}' $name
awk: avg.awk:11: ^ invalid char ''' in expression
Я думаю, что я близок, но я действительно не знаю, куда идти отсюда. Код не должен быть невероятно сложным, поскольку все, что мы видели в классе, было довольно простым. Пожалуйста, дайте мне знать.
Ответы
Ответ 1
awk '{ sum += $2; n++ } END { if (n > 0) print sum / n; }'
Добавьте числа в $2
(второй столбец) в sum
(переменные автоматически инициализируются до нуля на awk
) и увеличивают количество строк (которые также могут обрабатываться через встроенную переменную NR), В конце, если было прочитано хотя бы одно значение, напечатайте среднее значение.
awk '{ sum += $2 } END { if (NR > 0) print sum / NR }'
Если вы хотите использовать нотацию shebang, вы можете написать:
#!/bin/awk
{ sum += $2 }
END { if (NR > 0) print sum / NR }
Вы также можете управлять форматом среднего значения с printf()
и подходящим форматом ("%13.6e\n"
, например).
Вы также можете обобщить код, чтобы усреднить N-й столбец (с помощью N=2
в этом примере), используя:
awk -v N=2 '{ sum += $N } END { if (NR > 0) print sum / NR }'
Ответ 2
Ваша конкретная ошибка связана с линией 11:
awk 'BEGIN{sum+=$2}'
Это строка, в которой вызывается awk
, и ее блок BEGIN
указан, но вы уже находитесь в awk script, поэтому вам не нужно указывать awk
. Также вы хотите запустить sum+=$2
в каждой строке ввода, поэтому вы не хотите его в блоке BEGIN
. Следовательно, строка должна просто читать:
sum+=$2
Вам также не нужны строки:
x=sum
read name
первый просто создает синоним sum
с именем x
, и я не уверен, что делает вторая, но не требуется.
Это сделает ваш awk script:
#!/bin/awk
### This script currently prints the total number of rows processed.
### You must edit this script to print the average of the 2nd column
### instead of the number of rows.
# This block of code is executed for each line in the file
{
sum+=$2
# The script should NOT print out a value for each line
}
# The END block is processed after the last line is read
END {
# NR is a variable equal to the number of rows in the file
print "Average: " sum/ NR
# Change this to print the Average instead of just the number of rows
}
Ответ Джонатана Леффлера дает awk один вкладыш, который представляет один и тот же фиксированный код, с добавлением проверки наличия как минимум 1 строки ввода (это останавливает любое деление на нулевую ошибку). Если
Ответ 3
Попробуйте следующее:
ls -l | awk -F : '{sum+=$5} END {print "AVG=",sum/NR}'
NR - встроенная переменная AWK для подсчета no. записей
Ответ 4
awk 's+=$2{print s/NR}' table | tail -1
Я использую tail -1
для печати последней строки, которая должна иметь среднее число...