首页 > 解决方案 > 帮助格式化列平均值的 AWK 脚本

问题描述

下面我试图让这个 awk 脚本显示每个单独的考试平均值以及考试本身的平均值。我知道每行代码的执行方式都放在哪里。这就是我需要它的样子:

名称 考试 1 考试 2 考试 3 考试 4 平均

乔 0.0 75 87 91
约翰 0.0 86 72 83

考试 1 平均:0.0

考试 2 平均分:80.5

考试 3 平均分:79.5

#!/usr/bin/awk -f                                                                              
                                                                                               
NR == 1{                                                                                       
    printf "%s \t %28s %7s %7s %7s %7s\n", "Name", "Exam 1", "Exam 2", "Exam 3", "Exam 4", "Av\
erage"                                                                                         
}                                                                                              
                                                                                               
                                                                                               
{                                                                                              
    examSTUAVG = ($3 + $4 + $5) / 4;                                                           
    printf "%s \t %28s %7s %7s %7s %7.1f\n", $1, "0", $3, $4, $5,examSTUAVG                    
                                                                                               
    {exam2Total += $3}                                                                         
    {exam3Total += $4}                                                                         
    {exam4Total += $5}                                                                         
    printf "Exam 1 Average is %19s\n", "0.0"                                                   
    printf "Exam 2 Average is %19.1f\n", exam2Total / NR                                       
    printf "Exam 3 Average is %19.1f\n", exam3Total / NR                                       
    printf "Exam 4 Average is %19.1f\n", exam4Total / NR                                       
}                                                                                              
                                                                                               
{ print ""}   

标签: awkformatting

解决方案


你需要这个脚本。您可以将其另存为:program.awk. 我添加END了用于在最终打印平均值的块。

#!/usr/bin/awk -f    
{                                                                                                                                                                      
    if(NR == 1){                                                                                       
        printf "%s \t %28s %7s %7s %7s %7s\n", "Name", "Exam 1", "Exam 2", "Exam 3", "Exam 4", "Average"   
    }                                                                                                                                                                               
    else{                                                                                              
        examSTUAVG = ($3 + $4 + $5) / 4;                                                           
        printf "%s \t %28s %7s %7s %7s %7.1f\n", $1,$2, $3, $4, $5,examSTUAVG                    

        {exam1Total += $2}                                                                         
        {exam2Total += $3}                                                                         
        {exam3Total += $4}                                                                         
        {exam4Total += $5}                                                                         
    }                                                                                              
}
                                                                                               
END{    
    myrows=NR-1
    printf "Exam 1 Average is %19.1f\n", exam1Total / myrows
    printf "Exam 2 Average is %19.1f\n", exam2Total / myrows                                       
    printf "Exam 3 Average is %19.1f\n", exam3Total / myrows
    printf "Exam 4 Average is %19.1f\n", exam4Total / myrows                                    
} 

输入是文件data.txt

Name Exam 1 Exam 2 Exam 3 Exam 4 Average

Joe 0.0 75 87 91
John 0.0 86 72 83

并将其执行为:

./program.awk data.txt

我得到了这个输出:

Name                           Exam 1  Exam 2  Exam 3  Exam 4 Average
Joe                               0.0      75      87      91    63.2
John                              0.0      86      72      83    60.2
Exam 1 Average is                 0.0
Exam 2 Average is                80.5
Exam 3 Average is                79.5
Exam 4 Average is                87.0

推荐阅读