linux - 使用 shell 计算学生的平均分

标签 linux bash shell sorting awk

我有一个名为:'winter' witch 的文件,每行包含一个学生姓名和他在冬季期末考试中的平均成绩:

John 4
Brian 8.5

另一个名为“summer”的文件每行包含一个学生姓名和他夏季期末考试的 5 个成绩:

John 8 7 9 4 7
Brian 10 9 4 5 8

我想计算每个学生的年平均成绩:

John ((8+7+9+4+7)/5 + 4)/2
Brian ((10+9+4+5+8)/5 + 8.5)/2

输出将按年平均值排序,因此成绩最高的学生排在第一位。

我希望使用 shell 编程来完成。

我尝试使用 awk 计算平均值:

awk '{print $1 " " ($2 + $3 + $4 + $5 + $6)/5}' summer

但我不知道如何继续,甚至不知道如何开始。

最佳答案

这是一种方法:

$ awk 'FNR==NR{a[$1]=$2;next}{print $1,(a[$1]+($2+$3+$4+$5+$6)/5)/2}' winter summer | sort -rnk2
Brian 7.85
John 5.5

解释:

只有当我们在第一个文件 winter 中时,条件 FNR==NR 才为真,因此该 block 仅针对该文件执行。该 block 只是创建一个数组,其中学生姓名是键,成绩是值。 next 语句跳转到文件中的下一行。当我们在第二个文件中时,脚本与您的脚本大致相同,但我们使用数组从第一个文件中获取成绩。排序很简单 -r 在第二个字段 -k2 上反转 -n 数字排序。

需要注意的是,这个脚本假设没有两个学生有相同的名字。

关于linux - 使用 shell 计算学生的平均分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16201096/

相关文章:

shell - 检查 shell 脚本中是否存在带有通配符的文件

bash - 我什么时候可以在 Bash 中使用 |&?它可以在其他 shell 中使用吗?

php - php exec() 中的 sudo

bash - 将带符号的 10 位二进制数转换为十进制数?

python - uwsgi: os.getenv ("PATH") 不适用于 linux 中的/etc/environment

arrays - bash-调用jq会生成语法错误和INVALID_CHARACTER消息

c++ - 命令行实用程序可以比 C++ 更快吗?

linux - 使用 mac 地址验证运行 Shell 脚本

linux - 套接字编程 gfortran

linux - 如何反汇编系统调用