Gegeben die Ausgabe von git ... --stat
:
Ich wollte die Summe der numerischen Spalten erzeugen, aber die Formatierung der Zeile beibehalten. Im Interesse der Allgemeinheit habe ich dieses awk-Skript erstellt, das automatisch alle numerischen Spalten summiert und eine Zusammenfassungszeile erzeugt:
%Vor%Nachgeben:
%Vor%Awk hat mehrere Funktionen, die das Problem vereinfachen, wie die automatische String- & gt; -Zahlenumwandlung, alle Arrays als assoziative Arrays und die Möglichkeit, automatisch aufgeteilte Positionsparameter zu überschreiben und dann die äquivalenten Zeilen zu drucken.
Gibt es eine bessere Sprache für diesen Hack?
Inspiriert von ChristopheDs awk-Lösung. Wird mit dem Befehlszeilenschalter -an
verwendet. 43 Zeichen + 4 Zeichen für den Befehlszeilenschalter:
Ich kann es mit ein bisschen Schummeln auf 45 (41 + -ap
switch) bringen:
Ältere, Hash-basierte 66-Zeichen-Lösung:
%Vor%(in einem Bash-Skript ist $ 1 der Dateiname, der als Befehlszeilenargument angegeben wird):
%Vor%Man könnte natürlich auch die Eingabe pipen (würde bei der Erlaubnis noch 3 Zeichen sparen).
Dieses Problem ist nicht schwierig oder schwierig ... es ist aber "süß".
Hier ist die Lösung in Python:
%Vor% Was macht es ... es hält sich in r
, während es Zeile für Zeile weiterläuft. Teilt die Zeile und fügt sie für jedes Element der Liste, wenn es sich um eine Zahl handelt, zur Tally hinzu oder behält sie als Zeichenfolge bei. Am Ende werden sie alle wieder in eine Zeichenkette umgewandelt und mit Leerzeichen dazwischen zusammengefügt, um gedruckt zu werden.
Alternative, mehr "algebraische" Implementierung, wenn es uns nicht wichtig wäre, alle Eingaben gleichzeitig zu lesen:
%Vor% Was macht dieser? totalize()
nimmt eine Liste von Strings und versucht die Summe der Zahlen zu berechnen; Wenn das fehlschlägt, gibt es einfach den letzten zurück. zip()
wird mit einer Matrix gefüllt, bei der es sich um eine Liste von Zeilen handelt, die jeweils eine Liste von Spaltenelementen in der Zeile darstellen. zip transponiert die Matrix, sodass sie in eine Liste von Spaltenelementen umgewandelt wird. Anschließend wird totalize
für jede Spalte aufgerufen Ergebnisse werden wie zuvor verknüpft.
Um den Code etwas länger zu machen, habe ich das Haupt-Parsing in die BEGIN
-Klausel verschoben, damit die main-Klausel nur numerische Felder verarbeitet. Für eine etwas größere Eingabedatei konnte ich eine deutliche Verbesserung der Geschwindigkeit messen.
Ich habe eine Testdatei mit Ihren Daten erstellt und paste file file file ...
und cat file file file ...
ausgeführt, so dass das Ergebnis 147 Felder und 1960 Datensätze enthielt. Meine Version dauerte etwa 1/4 so lang wie deine. Auf den Originaldaten war der Unterschied nicht messbar.
Eingabe:
%Vor%Code:
%Vor%Ausgabe:
%Vor%Hinweis: explode () erfordert, dass vor der neuen Zeile ein Leerzeichen steht.
Tags und Links language-agnostic awk code-golf