我们如何使用 shell 脚本对文件中的值进行分组求和

How can we sum the values group by from file using shell script

我有一个文件,其中包含学生卷号、姓名、主题、获得分数和总分数数据:

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 += }END{print sum" "}' | sort | uniq -c | sort -nr | head -n 10

这不起作用link 按总和分组。

使用一个 awk 命令:

awk '{a[]+=} END {for (i in a) print i,a[i]}' file

输出

William 190
John 250

如果要对输出进行排序,可以通过管道传输到 sort,例如按数字第二个字段降序:

awk '{a[]+=} END {for (i in a) print i,a[i]}' file | sort -rnk2

或按学生姓名升序:

awk '{a[]+=} END {for (i in a) print i,a[i]}' file | sort

您需要在 awk 中使用关联数组。

尝试

awk '{ a[]=a[]+ } END {for (i in a) print i, a[i]}' 

a[]=a[]+ 创建关联数组,其中 $2 作为索引,值总和 $4 作为值

END <-- 处理所有记录

for (i in a) print i, a[i] <-- 打印数组的索引和值

演示:

$awk '{ a[]=a[]+ } END {for (i in a) print i, a[i]}' temp.txt 
William 190
John 250
$cat temp.txt 
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
$