2016-12-25 3 views
2

Ich habe eine Datei in einem Studenten Name, Vorname und 4 Punkte der Klassen beziehe „Marken“ mit Linien Titel nahm er in diesem Semester für jede Zeile wie folgt aus:Awk: Drucken der Durchschnitt jeder Zeile

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

Ich versuche ein awk-Skript zu erstellen, das jede Zeile mit der Durchschnittsmarkierung für jede Zeile (aka jeder Schüler) und die Nummer der Zeile, die er ist, druckt.

f.e.

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

und so weiter und so weiter.

Was kam ich mit ist die folgende:

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

Aber der Ausgang dieses ist ein Chaos, das wie ein kartesisches Produkt scheint:

enter image description here

ich dort bin Verdacht ist Etwas stimmt nicht mit dem Ausdruck i<FNR überein, der die Zeilen für jede Schleife ändert.

Wie sollte es gewesen sein?

+0

ich glaube, Sie '% .2f' bedeuten, nicht mit dem $ -Zeichen – user2314737

+1

Sie haben keine Schleife. awk erledigt das Schleifen für jede Zeile. So etwas ist genug: 'awk '{print" Student "-NR", ", $ 1 $ 2", ", ($ 3 + $ 4 + $ 5 + $ 6)/4}" yourfile ". –

+0

@ user2314737 es ist ein Tippfehler, ich bearbeite es gerade jetzt. – Coursal

Antwort

2

Wenn die Namen der Schüler in der Datei eindeutig sind Sie brauchen nicht die for Schleife

avg=($3+$4+$5+$6)/4; 
printf("Student %d, %s %s, %.2f\n", NR, $1, $2, avg); 

Wo Sie eine for Schleife ist für die Berechnung der Summe verwenden könnte (dies kann bei praktisch sein, Sie haben mehr als 4 Felder hinzugefügt werden):

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