#bash #awk
#bash #awk
Вопрос:
- поля ввода расположены в следующем порядке: фамилия, имя, раздел, назначение, оценка.
- со списком оценок из входного файла grades.txt , создайте awk-скрипт, который печатает в соответствии с приведенным ниже форматом.
- выведите среднюю оценку и количество неудачных оценок (<= 60) в указанном разделе.
grades.txt:
Alicia, Joseph, 2, 1, 40
Alfonzo, Gary, 3, 3, 85
Albert, Tom, 2, 1, 90
Bailey, Linda, 3, 2, 76
Butcher, Stewie, 3, 1, 80
Buser, Gary, 1, 3, 59
Canyon, Nicole, 2, 5, 90
ПРИМЕР ВЫВОДА для раздела 1 (для
номера раздела, указанного в cmd-строке)
Gary Buser – 59 – 3
Fails = 1
Average Grade = 59
BEGIN {
# first last - grade - assignment
# Fails = 1
# Avg Grade = grade
}
{
for(i=0; i<=NF; i )
print($2, $1, $5, "-", $4);
total =$5;
if ( $5 <= 60 )
fails=fails ;
else {
fails=0;
}
avg=total/i;
}
END {
print("Fails =", fails);
print("Average Grade =", avg);
}
Командная строка, которую я пытаюсь использовать, но она не работает:
awk '$3==1' -f name.awk grades.txt
Что я делаю неправильно для достижения желаемого результата?
Комментарии:
1. Пожалуйста, не используйте нерелевантные языковые теги (для расширения аудитории или по какой-либо другой причине).
2. Я не совсем понимаю, какую команду awk я должен использовать. Я знаю, что вам нужно указать, какую «секцию» студентов захватить, но это все
3. Пожалуйста, не создавайте больше работы для других людей, вандализируя свои сообщения. Публикуя в сети Stack Exchange, вы предоставляете Stack Exchange не подлежащее отзыву право в соответствии с лицензией CC BY-SA 4.0 на распространение этого контента (т. Е. Независимо от вашего будущего выбора). Согласно политике обмена стеками, распространяется версия post, не подвергшаяся вандализму. Таким образом, любой вандализм будет отменен. Если вы хотите узнать больше об удалении записи, пожалуйста, смотрите: Как работает удаление?
Ответ №1:
$ cat tst.awk
BEGIN { FS="[[:space:]]*,[[:space:]]*" }
$3 == sect {
print $2, $1, "-", $5, "-", $4
if ( $5 <= 60 ) {
fails
}
sum = $5
cnt
}
END {
print "Fails =", fails 0
print "Average Grade =", (cnt ? sum / cnt : 0)
}
$ awk -v sect=1 -f tst.awk grades.txt
Gary Busey - 43 - 3
Fails = 1
Average Grade = 43
Комментарии:
1. Отлично, еще один вопрос, как (cnt? sum / cnt : 0) переведено на английский?
2. Это просто троичное выражение, как видно на многих языках программирования, где оператор
<condition> ? <expression 1> : <expression 2>
означаетif <condition> then <expression 1> else <expression 2>
, что в этом случае он проверяет, что cnt не равен нулю, и если это так, делит сумму на cnt, в противном случае выводит 0. Я использую этот тест для защиты от ошибки деления на ноль, если в вашем вводе не было записей для данногоsect
. Смотрите https://en.wikipedia.org/wiki/? : .