【问题标题】:How to split file with students into array using awk如何使用awk将学生文件拆分为数组
【发布时间】:2016-06-29 23:04:39
【问题描述】:

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

*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 {}

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

【问题讨论】:

  • 首先编写一个 awk 脚本。如果您有问题,请在此处发布脚本和结果。提出具体问题,您更有可能获得帮助。
  • 我已经添加了一些我拥有的代码。谢谢
  • average 25 来自哪里?为什么EN 字符串出现在所需的输出中,为什么OS 字符串没有出现? split 是什么意思?
  • @Jdamian OS = 20 和 EN = 30,所以平均值是 25...

标签: awk


【解决方案1】:

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

$ 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

【讨论】:

  • 更好,但缩进真的没有意义。
猜你喜欢
  • 2015-08-22
  • 2016-08-01
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 2011-12-22
相关资源
最近更新 更多