On 12/22/2011 03:35 AM, David Haller wrote:
Hallo,
Am Thu, 22 Dec 2011, Bernd Obermayr schrieb:
David Haller schrieb: [...]
awk 'BEGIN { FS = OFS = ";" } { $4 = sprintf("%d", $4); print; }' csvfile.csv
Hi, da hätt ich auch noch einen:
awk 'BEGIN { FS = OFS = ";" } { $4 = int($4); print }' csvfile.csv Jo, müßte gehen.
Danke für's mitdenken, Bernd!
Geht aber nur wenn $4 komplett aus Ziffern besteht ;) Das gilt beim 'sprintf("%d")' genauso ... Wirklich universell und z.B. tolerant zu hex-Ziffern ist wohl nur die Regex-Variante 'sub(/^0+/,"", $4);'.
Seltsamerweise geht z.B. ein:
awk 'BEGIN{ printf("%d\n", int(0x0a)); }'
(Ausgabe: "10") aber weder
echo "0x0a" | awk '{ printf("%d\n", int($1));}'
### man awk: To force a variable to be treated as a number, add 0 to it; echo "0x0a" | awk '{ printf("%d\n", int($1+0));}' echo "0x0a" | awk '{ printf("%d\n", int($1)+0);}' echo "0x0a" | awk '{ n=$1; n+=0; printf("%d\n", int(n));}'
(noch die Varianten der letzteren 2 ohne int). (GNU) AWK scheint Zahlen wirklich etwas komisch zu parsen (das mit den Hex-Zahlen ist wohl ne GNU-Erweiterung[1], und die ist dann wohl seltsam und unvollständig umgesetzt).
Also ich würd' an der Stelle auf dann perl umsteigen, da gibt's mit u.a Text::CSV, Tie::CSV, DBD::CSV (Backend für die DBI Schnittstelle), auch ein paar sehr nette Module um mit CSV Dateien zu hantieren, sogar mit korrektem Quoting von " in von "" umschlossenen Feldern, IIRC, woran man nur mir awk schon wieder kirre würde. ;)
Jedenfalls, ich mag die bash, ed, sed, und awk, sehr, aber ich schreib komplexere "Mehrzeiler" überwiegend in perl, zumal auf meiner neuen Kiste die Startzeit von Perl bei weitem nicht mehr so lang ist wie auf der alten...
$ time perl -e 1
real 0m0.004s user 0m0.000s sys 0m0.000s
Das kommt davon, wenn man ständig perl verwendet ;) Ok, mit komplexen Modulen wird's _viel_ lahmer (Modul finden, öffnen, parsen)...
$ time perl -MMIME::Parser -e 1
real 0m0.683s user 0m0.096s sys 0m0.016s $ time perl -MMIME::Parser -e 1
real 0m0.099s user 0m0.064s sys 0m0.020s
$ time perl -MMIME::Parser -MHTML::Parser -MDBD::CSV -e 1 real 0m0.808s $ time perl -MMIME::Parser -MHTML::Parser -MDBD::CSV -e 1 real 0m0.174s
(Dabei darf man perl + MIME::Parser nur nochmal ca. ~0.1s zurechnen, d.h für HTML::Parser + DVD::CSV gehen ~0.7s beim ersten Aufruf drauf).
... zumindest beim ersten Mal ;) Aber im 'strace' sieht man trotzdem den Aufwand, der für jedes Modul getrieben wird. Man sollte also immer schauen, ob sich der jew. "Aufwand" ein Modul zu laden oder etwas selber zu schreiben abwägen. Aber das ist eher für Fortgeschrittene ;)
Wie gesagt: auf der neuen Kiste ist sowas für mich Wurst, v.a. wenn in nem (komplexen Script, Laufzeit einige s) dann z.B. eh nen mencoder aufgerufen wird, der dann je nach Datei 30min bis auch mal 4h am rödeln ist ... ;) Auf dem alten Rechner (ca. 1/16tel so schnell) hab ich die Startzeiten von Perl durchaus noch etwas mehr berücksichtigt).
Und auch auf aktuellen Kisten kann man sich mit "perl innen in ner Schleife" noch herrlich ins Knie schießen[2] und moderne Kisten ausbremsen.
-dnh
[1] GNU EXTENSIONS [..] Octal and hexadecimal constants in AWK programs.
[2] korrekt wäre: mind. die Schleife ins perl rein, ggfs. also das ganze Script nach perl umschreiben. BTDT. Lohnt sich dann meist eh.
Ich freu mich echt total, dass eine "einfache" Aufgabe so viel Interesse zeigt. Und das gleich von den Vollprofis unter euch. Das zeigt mal wieder, wie viele Wege nach Rom führen. Da hab ich ja noch viel zu lernen. Toll das es dieses OS und dieses Forum gibt. lg Andy -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org