3 Stimmen

Excel und awk sind sich nicht einig über CSV-Summen

Ich habe eine CSV-Datei, die ich auf zwei Arten zusammenzählen möchte: einmal mit Excel und einmal mit awk . Hier sind die Summen der ersten 8 Spalten in Excel:

1) 2640502474.00
2) 1272849386284.00
3) 36785.00
4) 
5) 107.00
6) 239259.00
7) 0.00
8) 7418570893330.00

Und hier ist mein awk Ausgabe:

$ cat /home/jason/import.csv | awk -F "\"*,\"*" '{s+=$1} END {printf("%01.2f\n", s)}'
2640502474.00
$ cat /home/jason/import.csv | awk -F "\"*,\"*" '{s+=$2} END {printf("%01.2f\n", s)}'
1272849386284.00
$ cat /home/jason/import.csv | awk -F "\"*,\"*" '{s+=$8} END {printf("%01.2f\n", s)}'
7411306364347.00

Beachten Sie, dass 1 und 2 genau übereinstimmen, aber 8 um viele Millionen daneben liegt. Ich gehe davon aus, dass die Gesamtsumme von Excel richtig ist, warum also awk diese Datei anders behandeln?

3voto

Alex Stoddard Punkte 8149

Sie haben wahrscheinlich eine kommaformatierte Zahl in Anführungszeichen. Excel behandelt diese Zahl ordnungsgemäß als ein einzelnes Feld. Ihre Regex für die Feldtrennung in awk tut das nicht - ein Komma innerhalb einer Zahl ist laut dieser Regex ein gültiges Trennzeichen. Es ist sehr schwierig (und meist sinnlos) zu versuchen, optionales verschachteltes Escaping, wie es in csv möglich ist, mit einer Regex zu behandeln.

Vergleichen Sie die folgenden Angaben, um zu sehen, was wahrscheinlich vor sich geht:

$ echo '"1","10","15","1,000","14"' | awk -F "\"*,\"*" '{print $4}'
1
$ echo '"1","10","15","1,000","14"' | awk -F "\",\"" '{print $4}'
1,000

Beachten Sie, dass die zweite obige Regex immer noch ein Problem mit einem nachgestellten " im letzten Feld hat und nur dann funktioniert, wenn alle Felder durchgängig in Anführungszeichen gesetzt sind - sie dient nur der Veranschaulichung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X