计算 awk 中输入文件的百分比和等级

问题描述 投票:0回答:3

我有一个包含示例数据的文件,如下所示:

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
awk scripting
3个回答
4
投票

如果您只是想通过执行操作获得您提到的学生百分比(总得分除以总可能得分),请尝试以下操作,尽管我不确定为什么存在超过 1 个学生姓名,或者我们是否需要采取他们各自的线的百分比然后取平均值?我的评论涵盖了这个问题。

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


编辑:在了解詹姆斯先生的答案后,我知道我的猜测可能是正确的,您可能需要所有出现的学生姓名值的总数,最后您需要百分比等,在这种情况下尝试遵循,这应该保持根据输出中的输入文件确保学生姓名的顺序。

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
投票

另一个在 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

0
投票

在上面的问题中,你们回答我希望我的输出位于 姓名 百分比 字母 安德鲁 75.21 C 切尔西 92.21 A 肖恩 77.64 C 艾娃 79.76 C 山姆 62.34 D

© www.soinside.com 2019 - 2024. All rights reserved.