1

我正在尝试计算一组学生在不同科目中的标准差。我只是有点卡在我需要做的最后一个计算上,我只是不确定问题是什么。

BEGIN {
    i=0
    printf("\nResults for form 6B\n")
    }         
$1=="SUBJECT" {
        i++
        subject[i]=$2
    total[i]=0
    count[i]=0
    printf("\nLits of %s Students\n",subject[i])
    printf("Name         Mark    Pass/Fail\n")
    printf("----         ----    ---------\n")
    }
NF>2 {  mark[i] = ($3+$4)/2 
    student=$2" "$1
    total[i] = total[i]+mark[i]
    count[i] = count[i]+1
    if (mark[i]>49)
        result="Pass"
        else
        result="Fail"
    printf("%-14s%-3d%10s \n",student, mark[i], result)
    }
END {  top = i
        printf("\nSubject        Mean     Standard Deviation\n") 
        printf("-------        ----     ------------------\n")
    var=0
    for(i=1;i<=top;i++){
        mean[i]=total[i] / count[i]

        var+=((mark[i]-mean[i])^2) #Standard deviation not working#
        stdev=sqrt(var/count[i])

        printf("%16-s%-3d%12d \n",subject[i],mean[i],stdev) 
        }
    }

忘记添加输入文件“标记”

FORM    6B
SUBJECT Maths  
Smith   John    40  50 
Evans   Mike    50  80 
SUBJECT Physics
Jones   Tom 35  65
Evans   Mike    46  76
Smith   John    34  56
SUBJECT Chemistry
Jones   Tom 50  60
Evans   Mike    30  40

我得到的输出是数学 7 物理 7 化学 11

正确的值为 10 6 10

4

1 回答 1

0

查看gawkprintf文档。下面将说明正在发生的事情:

$ awk 'BEGIN { printf "%%d:%d %%i:%i %%f:%f %%s:%s\n", 3.8, 3.8, 3.8, 3.8}'

%d:3 %i:3 %f:3.800000 %s:3.8

所以,%i%d浮子放在地板上。%f您可以使用一些修饰符指定数字的外观。

于 2015-07-14T14:13:09.303 回答