Gegeben eine Datei mit zwei Spalten:
Id ht
510 69
510 67
510 65
510 62
510 59
601 29
601 26
601 21
601 20
Ich brauche eine Möglichkeit, alle Zeilen mit derselben ID zu einer Zeile mit einer durchschnittlichen Höhe zusammenzuführen. In diesem Fall ist (69 + 67 + 65 + 62 + 59) / 5 = 64 und (29 + 26 + 21 + 20) / 4 = 24, daher sollte die Ausgabe sein:
Id Avg.ht
510 64
601 24
Wie kann ich das mit sed / awk / perl machen?
text-processing
awk
perl
Jack
quelle
quelle
Antworten:
Mit awk:
Die Eingabedatei
Awk in einer Muschel:
Oder mit Perl in einer Shell:
Ausgabe ist:
Und zum Schluss noch ein Witz, ein dunkel verschleierter Perl-Einzeiler =)
quelle
Ausgabe:
Beachten Sie, dass Ihre Beispielausgabe falsch ist. Es gibt keine Möglichkeit, einen Durchschnitt von 52 zu erhalten, wenn jeder Wert für diese ID 59 oder größer ist.
Außerdem haben Sie einen Buchstaben
l
in einer Ihrer Spalten, der sich als Zahl tarnt1
...quelle
Mit
gnu
datamash
:Dieser
s
ort undg
ruppen von1
st Feld Berechnung2
ndmean
Feldwertes, die ErhaltungH
eaders. Es wird davon ausgegangen, dass die Felder durch eine einzelne Registerkarte getrennt sind. Verwenden-W, --whitespace
Sie diese Option, wenn sie durch mehrere Leerzeichen getrennt sind oder-t, --field-separator=
um ein anderes Feldtrennzeichen (Leerzeichen, Komma usw.) zu definieren. Dadatamash
eine sortierte Eingabe erforderlich ist, wird die Ausgabe nach der gruppierten Spalte sortiert.quelle
Schauen Sie sich an, was hier gemacht wird: http://www.sugihartono.com/programming/group-by-count-and-sorting-using-perl-script/
Der wesentliche schwierige Teil ist die Durchführung einer "Group by" -Operation. Das verknüpfte Skript verwendet dazu einen Hash.
In diesem Link berechnen sie die Summe, aber der Durchschnitt wird nicht viel anders sein.
quelle