在Linux中用AWk编程:统计词频 统计考试成绩,假设学生成绩清单如下

在Linux中用AWk编程:统计词频 统计考试成绩,假设学生成绩清单如下,第1张

(1)每个学生的总分平均分

awk '{for ( a=2a<=(NF+1)a++ ){sum=sum+$a}}{print $1,sum/(NF-1)sum=0}' /test/student.data | sort -k2 -r | awk 'BEGIN{A[1]="A"A[2]="B"A[3]="C"A[4]="D"A[5]="E"A[6]="F"}{print A[NR]":",$0}'

(2)每个科目的平均分(从上至下平均分分别是数据中从左至右科目的)

#!/bin/bash

for (( i=2i<=(NR+1)i++ ))

do

awk '{sum+=$'$i'}END{print sum/NR}' /test/student.data

done

(2)-1班级总平均分

awk '{for ( a=2a<=(NF+1)a++ ){sum=sum+$a}}END{print sum/(NF-1)}' student.data

y:root:/tmp/ss> cat xx44.dat

jasper: 80 82 84 84 88 92 

andrea: 85 89 90 90 94 95 

oellis: 89 90 92 96 96 98

mona: 70 70 77 83 85 89

john: 78 85 88 91 92 94

dunce: 60 60 61 62 64 80

y:root:/tmp/ss> ./xx44

Total 6 Average 83

jasper: 80 82 84 84 88 92 average 85(B)

andrea: 85 89 90 90 94 95 average 90.5(A)

oellis: 89 90 92 96 96 98 average 93.5(A)

mona:   70 70 77 83 85 89 average 79(C)

john:   78 85 88 91 92 94 average 88(B)

dunce:  60 60 61 62 64 80 average 64.5(D)

high: 4 low: 2

A - 2

B - 2

C - 1

D - 1

y:root:/tmp/ss> cat xx44

#!/bin/bash

awk 'BEGIN{

        sum=0

}

function getmark(s)

{

        if(s<60)

                mark="F"

        else if(s>=60 && s<70)

                mark="D"

        else if(s>=70 && s<80)

                mark="C"

        else if(s>=80 && s<90)

                mark="B"

        else if(s>=90)

                mark="A"

        return mark

}

{

        name[NR]=$1

        subtotal[$1]=0

        for(i=2i<=NFi++){

                score[$1,i]=$i

                subtotal[$1]+=$i

        }

        average[$1]=subtotal[$1]/(NF-1)

        sum+=average[$1]

}

END{

        allav=sum/NR

        locount=0

        hicount=0

        printf("Total %d Average %d\n\n", NR, allav)

        for(key in name) {

                printf("%s\t", name[key])

                for(i=2i<=NFi++)

                        printf("%s ", score[name[key],i])

                printf("average %s(%s)\n",

                        average[name[key]],

                        getmark(average[name[key]]))

                if(average[name[key]] >= allav)

                        hicount++

                else

                        locount++

                markcnt[getmark(average[name[key]])]++

        }

        printf("\n")

        printf("\nhigh: %s low: %s\n", hicount, locount)

        for(key in markcnt)

                printf("%s - %s\n", key, markcnt[key])

}' xx44.dat

1)总分:awk 'END {print ($2+$3+$4+$5)/4}' score

说明,第一行,如NUM,math在做数值运算中,做0计算的。

各个成绩记录在文件 score中。

2)计算各个学生的成绩:

示例计算3241的平均成绩,awk '{if ($1=="3241") print ($2+$3+$4+$5)/4}' score


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8990418.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-23
下一篇2023-04-23

发表评论

登录后才能评论

评论列表(0条)

    保存