рассчитать процент и оценку из входного файла в awk - PullRequest
0 голосов
/ 08 октября 2019

У меня есть файл, который содержит примеры данных следующим образом:

Student Name,Assignment Type,Assignment Number,Total Earned Points,Total Possible Points
Chelsey,Final,FINAL,82,100
Chelsey,Survey,WS,5,5
Sam,Homework,H01,19,100
Sam,Homework,H02,82,100

Я хочу рассчитать взвешенную оценку (общее количество заработанных баллов, деленное на общее количество возможных баллов) для каждого учащегося и вывести список учащихся,их оценка в процентах и ​​буквенная оценка. Шкала букв оценивается следующим образом:

A = 90 >= grade <= 100
B = 80 >= grade < 90
C = 70 >= grade < 80
D = 60 >= grade < 70
E = grade < 60

Формат вывода:

Name    Percent Letter
Chelsey XX.XX   *
Sam     YY.YY   *

Как мне добиться этого в awk? В настоящее время у меня есть сценарий среднего столбца.

awk '
    NR>1{
        arr[$1]   += $4
        count[$1] += 1
    }
    END{
        for (a in arr) {
            print arr[a] / count[a]
        }
    }
' FILE

Ответы [ 2 ]

4 голосов
/ 08 октября 2019

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

awk '
BEGIN{
  FS=","
  print "Name    Percent Letter"
}
FNR>1{
  per=($4/$5)*100
  if(per>=90 && per<=100)   { grade="A" }
  else if(per>=80 && per<90){ grade="B" }
  else if(per>=70 && per<80){ grade="C" }
  else if(per>=60 && per<70){ grade="D" }
  else if(per<60)           { grade="E" }
  print $1,per,grade
}'   Input_file


РЕДАКТИРОВАТЬ: После понимания ответа Джеймс сэр узнал, что мое предположение может бытьправильно, и вам может понадобиться сумма всех вхождений значений имен учащихся, и, наконец, вам нужен процент и т. д., в этом случае попробуйте выполнить следующее, и это должно обеспечить безопасность ПОРЯДОК ИМЯ СТУДЕНТА в соответствии с файлом Input_file в выходных данных.

awk '
BEGIN{
  FS=","
  print "Name    Percent Letter"
}
FNR>1 && !student[$1]++{
  student_name[++count]=$1
}
FNR>1{
  student_possible_points[$1]+=$5
  student_total_points[$1]+=$4
}
END{
  for(j=1;j<=count;j++){
    per=(student_total_points[student_name[j]]/student_possible_points[student_name[j]])*100
    if(per>=90 && per<=100)   { grade="A" }
    else if(per>=80 && per<90){ grade="B" }
    else if(per>=70 && per<80){ grade="C" }
    else if(per>=60 && per<70){ grade="D" }
    else if(per<60)           { grade="E" }
    printf("%s %.02f %s\n",student_name[j],per,grade) | "sort -k1.1"
  }
}'  Input_file | column -t
3 голосов
/ 08 октября 2019

Еще один в awk. Примерно так же, как у @ RavinderSingh13, но этот анализ рассматривает только нижнюю границу процентного соотношения (так как порядок else if заботится о верхней границе):

$ awk '
BEGIN { FS="," }
NR>1 {
    tep[$1]+=$4
    tpp[$1]+=$5
}
END {
    print "Name\tPercent\tLetter"
    for(i in tep) {
        grade=100*tep[i]/tpp[i]
        if(grade>=90)
            letter="A"
        else if(grade>=80)
            letter="B"
        else if(grade>=70)
            letter="C"
        else if(grade>=60)
            letter="D"
        else 
            letter="E"                 # would ve expected F
        printf "%s\t%.2f\t%s\n",i,grade,letter
    }
}' file
Chelsey 82.86   B
Sam     50.50   E

Использование вкладок для разделения полейв выводе, так что если у вас есть имена, которые превышают ширину табуляции в символах, вывод будет выглядеть неприятно. В этом случае передайте вывод на column -t для очистки:

$ awk ... | column -t
Name         Percent  Letter
Chelsey      82.86    B
Sammmmmmmmm  50.50    E
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...