Я работаю в Bash и пытаюсь написать скрипт Awk, который берет данные из CSV-файла, группирует данные по строкам и затем получает значения min, max и avg значений.
Вот полный файл CSV:
Student,Catehory,Assignment,Score,Possible
Chelsey,Homework,H01,90,100
Chelsey,Homework,H02,89,100
Chelsey,Homework,H03,77,100
Chelsey,Homework,H04,80,100
Chelsey,Homework,H05,82,100
Chelsey,Homework,H06,84,100
Chelsey,Homework,H07,86,100
Chelsey,Lab,L01,91,100
Chelsey,Lab,L02,100,100
Chelsey,Lab,L03,100,100
Chelsey,Lab,L04,100,100
Chelsey,Lab,L05,96,100
Chelsey,Lab,L06,80,100
Chelsey,Lab,L07,81,100
Chelsey,Quiz,Q01,100,100
Chelsey,Quiz,Q02,100,100
Chelsey,Quiz,Q03,98,100
Chelsey,Quiz,Q04,93,100
Chelsey,Quiz,Q05,99,100
Chelsey,Quiz,Q06,88,100
Chelsey,Quiz,Q07,100,100
Chelsey,Final,FINAL,82,100
Chelsey,Survey,WS,5,5
Sam,Homework,H01,19,100
Sam,Homework,H02,82,100
Sam,Homework,H03,95,100
Sam,Homework,H04,46,100
Sam,Homework,H05,82,100
Sam,Homework,H06,97,100
Sam,Homework,H07,52,100
Sam,Lab,L01,41,100
Sam,Lab,L02,85,100
Sam,Lab,L03,99,100
Sam,Lab,L04,99,100
Sam,Lab,L05,0,100
Sam,Lab,L06,0,100
Sam,Lab,L07,0,100
Sam,Quiz,Q01,91,100
Sam,Quiz,Q02,85,100
Sam,Quiz,Q03,33,100
Sam,Quiz,Q04,64,100
Sam,Quiz,Q05,54,100
Sam,Quiz,Q06,95,100
Sam,Quiz,Q07,68,100
Sam,Final,FINAL,58,100
Sam,Survey,WS,5,5
Andrew,Homework,H01,25,100
Andrew,Homework,H02,47,100
Andrew,Homework,H03,85,100
Andrew,Homework,H04,65,100
Andrew,Homework,H05,54,100
Andrew,Homework,H06,58,100
Andrew,Homework,H07,52,100
Andrew,Lab,L01,87,100
Andrew,Lab,L02,45,100
Andrew,Lab,L03,92,100
Andrew,Lab,L04,48,100
Andrew,Lab,L05,42,100
Andrew,Lab,L06,99,100
Andrew,Lab,L07,86,100
Andrew,Quiz,Q01,25,100
Andrew,Quiz,Q02,84,100
Andrew,Quiz,Q03,59,100
Andrew,Quiz,Q04,93,100
Andrew,Quiz,Q05,85,100
Andrew,Quiz,Q06,94,100
Andrew,Quiz,Q07,58,100
Andrew,Final,FINAL,99,100
Andrew,Survey,WS,5,5
Ava,Homework,H01,55,100
Ava,Homework,H02,95,100
Ava,Homework,H03,84,100
Ava,Homework,H04,74,100
Ava,Homework,H05,95,100
Ava,Homework,H06,84,100
Ava,Homework,H07,55,100
Ava,Lab,L01,66,100
Ava,Lab,L02,77,100
Ava,Lab,L03,88,100
Ava,Lab,L04,99,100
Ava,Lab,L05,55,100
Ava,Lab,L06,66,100
Ava,Lab,L07,77,100
Ava,Quiz,Q01,88,100
Ava,Quiz,Q02,99,100
Ava,Quiz,Q03,44,100
Ava,Quiz,Q04,55,100
Ava,Quiz,Q05,66,100
Ava,Quiz,Q06,77,100
Ava,Quiz,Q07,88,100
Ava,Final,FINAL,99,100
Ava,Survey,WS,5,5
Shane,Homework,H01,50,100
Shane,Homework,H02,60,100
Shane,Homework,H03,70,100
Shane,Homework,H04,60,100
Shane,Homework,H05,70,100
Shane,Homework,H06,80,100
Shane,Homework,H07,90,100
Shane,Lab,L01,90,100
Shane,Lab,L02,0,100
Shane,Lab,L03,100,100
Shane,Lab,L04,50,100
Shane,Lab,L05,40,100
Shane,Lab,L06,60,100
Shane,Lab,L07,80,100
Shane,Quiz,Q01,70,100
Shane,Quiz,Q02,90,100
Shane,Quiz,Q03,100,100
Shane,Quiz,Q04,100,100
Shane,Quiz,Q05,80,100
Shane,Quiz,Q06,80,100
Shane,Quiz,Q07,80,100
Shane,Final,FINAL,90,100
Shane,Survey,WS,5,5
По сути, у меня есть 5 имен учеников, и каждый ученик выполнил викторину, лабораторную работу, домашнюю работу для каждого названия урока, плюс опрос и итоговый экзамен ...
То, что я пытаюсь сделать, это сгруппировать это по имени назначения и сгенерировать отчет, который показывает наименьшую оценку, достигнутую для этого назначения, наивысшую оценку и среднюю оценку ...
Вывод должен быть:
Name Low High Avg
H02 66 99 74.22
L07 47 88 66.30
и включать каждое имя отдельного назначения из столбца 3 (3 доллара США). отформатирован с использованием tab (/ t)
Код, который я вставил, уже выводит заголовки и 2 десятичных знака в столбце avg, но фактические значения не верны.
У меня только две проблемы :
Я не могу при жизни получить минимальное или максимальное значение для отдельных групп. Я знаю, как получить min / max и даже синтаксис basi c для него, но как мне получить его для отдельных групп?
Сценарии этого. У меня очень ограниченный опыт использования bash, или что-то еще Linux в этом отношении, и я не знаком с awk (хотя сейчас я немного учусь).
Итак, чтобы получить Я, по крайней мере, начал, я написал один вкладыш для достижения нужной группировки и выходного форматирования, но это всего лишь суммирование баллов для каждой группы, и среднее значение все перепутано, потому что я до сих пор не понял, как получить количество баллов для использования в качестве делителя.
В любом случае, это то, что у меня есть:
awk -F "," 'BEGIN{printf "Name\tLow\tHigh\tAvg\n"}
NR>=2{a[$3]+=$4; b[$3]+=$4;c[$3]+=$4/FNR }
END {for (i in b) printf "%-7s\t%d\t%d\t%.02f\n", i,a[i],b[i],c[i]}' \
score-data.csv
Вывод идеален в том смысле, что он группируется по именам присвоений, 2 десятичных знака в колонка avg и табуляция .... но низкие и высокие значения не верны, а среднее, как вы видите, испорчено ... попытался разделить сумму на FNR. Также пробовал NF и NR оба ... не повезло. Опять же, я знаю, как получить счет, но не знаю, как его получить здесь.
Итак, если кто-нибудь может помочь мне позаботиться о min / max / avg, а также о синтаксисе для этого было бы полезно, если бы это был сценарий
Я не могу комментировать по какой-то причине, но я искал в Google и прочитал материал man awk, и у меня в браузере открыты две разные вкладки для просмотра документов на awk. Никто из них не решает эту проблему в моей ситуации.
Что касается именования массивов, то это все тот же массив, который используется; ассоциативный массив, который использует столбец 3 в качестве индекса / ключа и значения из столбца 4 в качестве значений ключа. все предлагаемые поиски и ссылки включают столбцы; Мне нужны строки.