我们如何使用 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
$
我有一个文件,其中包含学生卷号、姓名、主题、获得分数和总分数数据:
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
$