2016-12-25 158 views
2

我有一个文件名为“标记”用指的是学生的名字,姓氏和类4标记线的平均他把这个学期的每一行是这样的:awk中:打印每一行

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

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

f.e.

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表达式令每个循环的线条都显得有些不妥。

它应该怎么样?

+0

我认为你的意思是'%.2f',而不是$符号 – user2314737

+1

你不必循环。 awk会为你循环遍历每一行。这样的东西就足够了:'awk'{print'Student'NR',',$ 1 $ 2“,”,($ 3 + $ 4 + $ 5 + $ 6)/ 4}'yourfile'。 –

+0

@ user2314737这是一个错字,我现在正在编辑它。 – Coursal

回答

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)}