如何使用awk将学生与学生分成数组

时间:2016-06-29 11:41:28

标签: awk

我有一个看起来像的文件:

*students.txt*
student_a OS 20
student_a EN 30
student_b OS -
student_c OS -
student_c EN 20

我想将其拆分为数组:

student    avarage maximum
student_a  25      EN 30
student_b  -       -
student_c  20      EN 20

如何仅使用AWK脚本执行此操作?

现在我只有:

#!/usr/bin/awk
BEGIN {
    while ((getline line < file) > 0) {
        print line;
    }
    close(file)
}
END {}

在此之后我不知道如何拆分它。

1 个答案:

答案 0 :(得分:3)

不清楚如何处理缺失值,但这似乎与您的输出相符。

$ awk -v OFS='\t' 'maxValue[$1]<$3{maxValue[$1]=$3; maxName[$1]=$2}
                        ($3+0==$3){sum[$1]+=$3; count[$1]++} 
                               END{print "student","average","maximum"; 
                                   for(k in maxValue) 
                                      print k, 
                                            count[k]?sum[k]/count[k]:"-",
                                            maxName[k]" "maxValue[k]}' file | 
  column -t -s$'\t'

student    average  maximum
student_a  25       EN 30
student_b  -        OS -
student_c  20       EN 20

<强>解释

计算最大值并为第一个字段键入的第三个字段分配相应的名称(即每个不同的第一个字段的最大值/名称对)。对于数值($3+0==$3是数值的测试)总和和计数。完成打印标题和每个键后,打印平均键(如果存在)和最大名称/值对。

格式column -t以对齐不同长度的标签字段。

<强>更新 要获得精确的输出匹配,请在最后一个打印参数中进行此更改

.. print ..., count[k]?maxName[k]" "maxValue[k]:"-"}' 

student    average  maximum
student_a  25       EN 30
student_b  -        -
student_c  20       EN 20