Awk:打印每行的平均值

3

我有一个名为“marks”的文件,其中每一行都涉及一个学生的名字、姓氏以及他这个学期参加的4门课程的成绩:

John McJohn 56 68 31 99
Ronald McDonald 89 89 60 75
Boaty McBoatface 50 50 50 50

我尝试创建一个awk脚本,该脚本会打印每行的平均分数(即每个学生的平均分数)和他所在的行数。

例如:

Student 1, John McJohn, 63,5
Student 2, Ronald McDonald, 78.25

等等,等等。

我想到的是以下内容:

{
    for(i=0; i<FNR; i++)
    {
        avg=($3+$4+$5+$6)/4;
        printf("Student %d, %s %s, %.2f\n", i, $1, $2, avg);
    }
}

但是这样的输出结果很混乱,看起来像笛卡尔积:

enter image description here

我怀疑 i<FNR 表达式存在问题,导致每个循环的行为异常。
应该如何修改?

我认为你的意思是 %.2f,而不是带有美元符号的。 - user2314737
1
你不需要使用循环。awk会自动对每一行进行循环。只需这样简单的一行代码就够了:awk '{print "学生" NR "," $1 $2 "," , ($3+$4+$5+$6)/4}' 你的文件名 - Lars Fischer
@user2314737 这是一个打字错误,我正在立即编辑它。 - Coursal
@LarsFischer 看起来完全可以。谢谢。 - Coursal
1个回答

2
如果文件中学生的姓名是唯一的,那么您不需要使用 for 循环。
avg=($3+$4+$5+$6)/4;
printf("Student %d, %s %s, %.2f\n", NR, $1, $2, avg);

你可以使用 for 循环来计算总和(如果你有多于4个字段需要相加,这将很方便):

for (i=3;i<7;i++) avg+=$i;
avg=avg/4;
printf("Student %d, %s %s, %.2f\n", NR, $1, $2, avg)}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接