Подтвердить что ты не робот

Используйте 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

Я думаю, что я близок, но я действительно не знаю, куда идти отсюда. Код не должен быть невероятно сложным, поскольку все, что мы видели в классе, было довольно простым. Пожалуйста, дайте мне знать.

4b9b3361

Ответ 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 для печати последней строки, которая должна иметь среднее число...