bash - 我们如何使用 shell 脚本对文件中的值分组进行求和
问题描述
我有一个文件,其中有学生卷号、姓名、主题、获得分数和总分数据:
10 William English 80 100
10 William Math 50 100
10 William IT 60 100
11 John English 90 100
11 John Math 75 100
11 John IT 85 100
我怎样才能得到shell Shell中每个学生的总和(总得分)?我想要这个输出:
William 190
John 250
我试过这个:
cat student.txt | awk '{sum += $14}END{print sum" "$1}' | sort | uniq -c | sort -nr | head -n 10
这不是按总和分组的工作链接。
解决方案
使用一个awk
命令:
awk '{a[$2]+=$4} END {for (i in a) print i,a[i]}' file
输出
William 190
John 250
如果要对输出进行排序,可以通过管道传输到sort
,例如按数字第二个字段降序:
awk '{a[$2]+=$4} END {for (i in a) print i,a[i]}' file | sort -rnk2
或按学生姓名升序:
awk '{a[$2]+=$4} END {for (i in a) print i,a[i]}' file | sort
推荐阅读
- java - 多个上下文路径的 jaxb2 问题
- watson-knowledge-catalog - 为什么在伦敦部署 Watson Knowledge Catalog 时,非结构化数据的 Profile 选项卡不显示?
- javascript - Gulp 4 - 拆分主 gulpfile.js
- javascript - 仅从 HTML 表单提交的字段的第一个字符
- android - Android 单元测试在枚举查找初始化时失败
- javascript - node.js perf_hooks 时间输出
- python - 如何将值插入到python中的嵌套表中?
- android - 从条形码扫描仪获取正确的输入
- mysql - 如何查询零件列表,以便轻松比较来自多个不同组的零件?(数据透视表?)
- php - 删除后使用PHP代码自动重置id序列以在mysql表中排序