awk: minimum und maximum finden in der Spalte
Ich bin mit awk, um mit einer einfachen .dat-Datei enthält mehrere Zeilen von Daten und jede Zeile hat 4 Spalten, getrennt durch ein einzelnes Leerzeichen.
Ich möchte zu finden, das minimum und das maximum der ersten Spalte.
Die Daten-Datei sieht wie folgt aus:
9 30 8.58939 167.759
9 38 1.3709 164.318
10 30 6.69505 169.529
10 31 7.05698 169.425
11 30 6.03872 169.095
11 31 5.5398 167.902
12 30 3.66257 168.689
12 31 9.6747 167.049
4 30 10.7602 169.611
4 31 8.25869 169.637
5 30 7.08504 170.212
5 31 11.5508 168.409
6 31 5.57599 168.903
6 32 6.37579 168.283
7 30 11.8416 168.538
7 31 -2.70843 167.116
8 30 47.1137 126.085
8 31 4.73017 169.496
Die Befehle, die ich benutzt habe sind wie folgt.
min=`awk 'BEGIN{a=1000}{if ($1<a) a=$1 fi} END{print a}' mydata.dat`
max=`awk 'BEGIN{a= 0}{if ($1>a) a=$1 fi} END{print a}' mydata.dat`
Jedoch, der Ausgang ist min=10 und max=9.
(Ähnliche Befehle zurückgeben kann mich den rechten minimum und das maximum der zweiten Spalte.)
Könnte mir jemand sagen, wo ich falsch war? Danke!
Die Werte werden als strings interpretiert, so sind die Ergebnisse der min/max in lexikographischer Reihenfolge.
Ich sehe, ich muss den cast von string in int in awk. Danke!!!
Ich sehe, ich muss den cast von string in int in awk. Danke!!!
InformationsquelleAutor Wang Zong'an | 2015-04-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Awk Vermutungen der Art.
String "10" kleiner als der string "4", weil die Zeichen "1" kommt vor "4".
Kraft, eine Art Gespräch, durch addition der null:
Auch eine überlegung Wert
awk 'NR==1{max = $1 + 0; next} {if ($1 > max) max = $1;} END {print max}'
die zuverlässig arbeitet für verschiedene Wert-Bereiche und sorgt dafür, dassmax
ist numerisch in der ersten Zuordnung. Wenn die Datei von beliebiger Größe, die Berechnung von min und max in einem single-pass helfen würde.Entfernen Sie außerdem das falsche "fi" am Ende des if-statements, z.B.:
awk 'BEGIN{a=1000}{if ($1<0+a) a=$1} END{print a}' mydata.dat
. In der Tat, ohne, dass awk zu erraten, die Art korrekt (obwohl die explizite Einstellung pro @Klaus, die Antwort ist besser).Recht, deine Methode ist flexibler. Wenn die Daten-Datei hat einen header, Ihre Methode zu vermeiden, können die Kopf-und beginnen mit der ersten Zeile der Daten.
InformationsquelleAutor Klaus Zeuge
nicht-awk Antwort:
Dass tee-Befehl
vielleicht ein bisschenviel zu clever. tee Duplikate seiner stdin-stream für die Dateinamen als Argumente, und es strömt die gleichen Daten auf stdout. Ich bin mit Prozess-Substitutionen zum filtern der Datenströme.Den gleichen Effekt verwendet werden können (mit weniger gedeihen) zum extrahieren der ersten und letzten Zeilen des Stroms der Daten:
oder
wie ist das?
danke glenn, es sieht besser aus 😉
InformationsquelleAutor glenn jackman
Dein problem war einfach, dass in deinem Skript, die Sie hatte:
und dass die endgültigen
fi
ist nicht Teil der awk-syntax, so dass es behandelt wird wie eine variable, soa=$1 fi
ist die string-Verkettung und so Sie SAGEN, awk, dassa
enthält eine Zeichenfolge, keine Zahl und daher der string-Vergleich anstelle von numerischen in der$1<a
.Wichtiger ist im Allgemeinen nie beginnen mit einem geschätzten Wert für max/min, verwenden Sie einfach den ersten Wert Lesen als die Samen. Hier ist die richtige Methode, das Skript zu schreiben:
Wenn Sie nicht wie
NaN
alles auswählen, was Sie es vorziehen, zu drucken, wenn die Eingabe-Datei leer ist.Du bist herzlich willkommen. Wenn Sie gerade erst anfangen zu lernen, awk, dem empfehle ich das Buch effective Awk Programming by Arnold Robbins.
Ich habe nicht gewusst, dass Buch vor. Ich werde es nachschlagen. Danke für die Empfehlung !
Es ist die einzige awk-Buch, das alle aktuellen awk Informationen, und es ist gut präsentiert. Es ist auch online verfügbar unter gnu.org/software/gawk/manual/gawk.html, aber IMHO verdient der Autor bezahlt für all seine Arbeit an dem Buch und auf GNU-awk und es ist eine gute Referenz zu haben, in dem Papier. Nicht bekommen, "Die AWK-Programmiersprache", da es veraltet ist, und nicht bekommen, "SED & AWK" als veraltet zu, und Sie brauchen nicht ein Buch, um zu lernen, wie zu sed benutzen, für die Dinge, die Sie sollten es für so die Hälfte des Buches ist Verschwendete Seiten.
InformationsquelleAutor Ed Morton