Ich habe eine CSV-Datei (in der das Feldtrennzeichen tatsächlich ein Komma ist) mit 8 Spalten und einigen Millionen Zeilen. Hier ist ein Beispiel:
1000024447,38111220,201705,181359,0,12,1,3090
1064458324,38009543,201507,9,0,1,1,1298
1064458324,38009543,201508,9,0,2,1,90017
Was ist der schnellste Weg, um die Summe aller Zahlen in einer bestimmten Spalte sowie die Anzahl der gelesenen Zeilen zu drucken? Können Sie erklären, was es schneller macht?
shell-script
text-processing
awk
sed
Elifarley
quelle
quelle
Antworten:
GNU Datamash
Einige Tests
Also
mawk
unddatamash
scheinen die Wahl zu sein.quelle
printf
Funktionsaufruf in den oben genanntenawk
Timings zu überspringen, da die anderen Tools keine textformatierte Ausgabe liefern (sie können nicht). Justawk -F',' '{ sum += $3 } END{ print sum, NR }' file
-M
Option zu gaffen, basierend auf Sundeeps Kommentar zu Romans Antwort. Dies ist eine ausgezeichnete Antwort. Vielen Dank, dass Sie mich mit datamash bekannt gemacht haben.Awk
ist ein schnelles und performantes Tool zur Verarbeitung von Textdateien.Beispielausgabe:
Konzeptioneller Hinweis :
Ich muss beachten, dass all diese Nicht-
awk
Alternativen nur für solche "idealen" numerischen Spalten schneller ausgeführt werden können. Es kostet Sie nur, ein etwas komplexeres Format zu haben (z. B. mit einigen zusätzlichen Informationen, die vor der Berechnung entfernt werden müssen<1064458324:a,<38009543:b,<201507:c,<9:d,<0:e,<1:f,<1:g,1298
), und all diese Geschwindigkeitsvorteile verschwinden (ganz zu schweigen davon, dass einige von ihnen nicht in der Lage sind, das Format auszuführen benötigte Verarbeitung).quelle
Sie können
cut
das Feld extrahieren, Zeichen zwischen die Zahlenpaste
einfügen+
undbc
sie summieren. Sie können verwenden,wc
um die Zeilen zu zählen.Ich bin mir jedoch nicht sicher, wie hoch die Leistung über Millionen von Zeilen sein würde. Aber die goldene Regel der Leistung ist, nicht zu raten, zu messen. Sie müssen jede Lösung profilieren, um festzustellen, ob sie die von Ihnen benötigte Leistung bietet, und um festzustellen, ob und um wie viel Änderungen die Leistung erhöhen oder verringern.
Hier ist eine Lösung, die ein bestimmtes Feld summiert und die Anzahl der Zeilen druckt:
Ausgabe:
Das Feld wird durch den angegebenen
-f#
Parameter aufcut
, hiercut -f3
.quelle