我有一个包含示例数据的文件,如下所示:
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
如果您只是想通过执行操作获得您提到的学生百分比(总得分除以总可能得分),请尝试以下操作,尽管我不确定为什么存在超过 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
另一个在 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
在上面的问题中,你们回答我希望我的输出位于 姓名 百分比 字母 安德鲁 75.21 C 切尔西 92.21 A 肖恩 77.64 C 艾娃 79.76 C 山姆 62.34 D