2016-03-21 8 views
0

Ich habe eine Datei test.txt mit dem folgenden Namen:awk Mit durchschnittlich Zahlen berechnen

10 
200 
3000 
======= 
4 
5 
======= 

Ich brauche einen awk-Skript zu schreiben, um den Text in dieser Datei als Eingabe in den awk-Skript und Ausgang zu nehmen :

10 
200 
3000 

Average 1070.00 

4 
5 

Average 4.50 

schrieb ich mein Skript wie folgt aus:

{while($1!~"=======") s+=$1;} 
{print "Average ", s} 

Jedes Mal, wenn ich th laufen ist Code, den ich verwende:

awk -f awrp4 test.txt 

Aber es stürzt ab. Ich weiß nicht, was ich falsch mache. Ich bin ein Anfänger und versuche, etwas über die awk-Funktion zu lernen, also entschuldige ich mich, wenn das ziemlich einfach erscheint. Jede Hilfe ist willkommen.

+1

Wie meinen Sie es " stürzt ab"? Sie brauchen in awk nur selten eine while-Schleife, weil sie zeilenweise eine Datei durchlaufen soll. Außerdem machst du keine Division, um deinen Durchschnitt zu finden. – miken32

+0

Es stürzt ab, weil 'while ($ 1! ~" ======= ") s + = $ 1;' eine Endlosschleife ist. –

Antwort

2

GNU awk verwenden, können Sie schreiben:

gawk ' 
    BEGIN {FS = "\n"; RS = "\n=+\n"} 
    NF > 0 { 
     sum = 0 
     for (i=1; i<=NF; i++) { 
      print $i 
      sum += $i 
     } 
     printf "Average %.2f\n", sum/NF 
    } 
' file 
+0

Beobachtung: während die Daten Bündel von 2 oder 3 Zeilen gleichzeitig sind, gibt es kein Problem mit dem Sammeln aller Zeilen auf einmal. Wenn die Daten in Bündeln von Millionen von Zeilen gleichzeitig vorliegen, benötigt dies mehr Speicher als ein zeilenweiser Ansatz. Allerdings müssen Sie sich dann auch Gedanken darüber machen, ob ein Überlauf ein Problem ist (wahrscheinlich nicht; "awk" ändert sich in "double" von integer) und so weiter. Heutzutage werden wenige Desktop- oder Server-Computer durch einige Gigabyte an Zahlen in einem Block ernsthaft in Mitleidenschaft gezogen, so dass es sich eher um einen theoretischen als um einen praktischen Einwand handelt. –

1

nichts sicher falsch mit Glenn-Lösung, aber es könnte ein bisschen fortgeschritten für Sie sein. Vielleicht ist das besser geeignet:

{ 
if ($1 == "=======") { 
    print "\nAverage " s/i "\n"; 
    s=0; 
    i=0; 
} else { 
    print $1; 
    s += $1; 
    i += 1; 
} 
} 

Wie ich in den Kommentaren erwähnt, ist die Art der awk durch jede Zeile einer Textdatei Schleife. Sofern Sie nicht nachbearbeiten oder mit Arrays arbeiten, ist eine while-Schleife wahrscheinlich nicht von großem Nutzen.

+0

Stellen Sie sicher, dass $ 1 vorhanden ist, bevor Sie "i" erhöhen. –

+0

Die Beispieldaten enthalten keine Leerzeilen, daher wollte ich keine unnötigen Komplikationen einbeziehen. – miken32

0
awk '$1~/^[[:digit:]]/ {i++; sum+=$1; print $1} $1!~/[[:digit:]]/ {print "Average", sum/i; sum=0;i=0}' file 
  • Die prüft zuerst teilweise, wenn das erste Zeichen aus der Kolonne 1 ist eine Ziffer, wenn ja, dann die Zähler inkrementieren ‚i‘ und füge diesen Datensatz (Nummer) zu summieren.
  • Der zweite Teil ist jede Aufzeichnung zu überspringen, die nicht mit einer Ziffer beginnt, und dann drucken Sie die durchschnittliche durch Dividieren sum/i, schließlich Zähler zurücksetzen und die Summe auf 0