我有一个看起来像的文件:
*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 {}
在此之后我不知道如何拆分它。
答案 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