Summieren Sie numerische Spalten automatisch und drucken Sie die Gesamtsumme

8

Gegeben die Ausgabe von git ... --stat :

%Vor%

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?

    
Ben Jackson 17.11.2010, 23:51
quelle

11 Antworten

5

Perl - 47 Zeichen

Inspiriert von ChristopheDs awk-Lösung. Wird mit dem Befehlszeilenschalter -an verwendet. 43 Zeichen + 4 Zeichen für den Befehlszeilenschalter:

%Vor%

Ich kann es mit ein bisschen Schummeln auf 45 (41 + -ap switch) bringen:

%Vor%

Ältere, Hash-basierte 66-Zeichen-Lösung:

%Vor%     
mob 23.11.2010, 16:45
quelle
2

Ruby - 87

%Vor%     
Nakilon 18.11.2010 12:54
quelle
2

Python - 101 Zeichen

%Vor%

Die Verwendung von reduzieren ist länger bei 126 Zeichen

%Vor%     
gnibbler 18.11.2010 20:58
quelle
2

AWK - 63 Zeichen

(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).

    
ChristopheD 22.11.2010 21:34
quelle
1

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.

    
Nas Banov 18.11.2010 02:58
quelle
1

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.

%Vor%

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.

    
Dennis Williamson 18.11.2010 08:06
quelle
1

JavaScript (Rhino) - 183 154 139 Bytes

Golf:

%Vor%

Lesbar-ish:

%Vor%     
Matt 21.11.2010 03:02
quelle
1

PHP 152 130 Zeichen

Eingabe:

%Vor%

Code:

%Vor%

Ausgabe:

%Vor%

Hinweis: explode () erfordert, dass vor der neuen Zeile ein Leerzeichen steht.

    
Nikolay Christov 01.06.2011 17:57
quelle
0

Haskell - 151 135 Bytes

%Vor%

... aber ich bin sicher, dass es besser / kleiner gemacht werden kann.

    
stusmith 18.11.2010 23:13
quelle
0

Lua, 140 Bytes

Ich weiß, dass Lua nicht die beste Golfsprache ist, aber verglichen mit der Größe der Laufzeiten ist es ziemlich gut, denke ich.

%Vor%     
jpjacobs 29.11.2010 10:50
quelle
0

PHP, 176 166 164 159 158 153

%Vor%

Dies würde jedoch die gesamte Eingabe in $ i erfordern ... Eine Variante mit $ i wird durch $ _ POST ["i"] so würde es in einem Textarea gesendet werden ... Hat 162 Zeichen:

%Vor%

Dies ist eine Version mit

KEINE HARDCODED COLUMNS

    
Aurel300 02.12.2010 22:16
quelle