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.
--
Q: What are the benefits of speaking to your fans via e-mail?
A: It's quicker, easier, and involves less licking. -- Douglas N. Adams
--
Um die Liste abzubestellen, schicken Sie eine Mail an:
opensuse-de+unsubscribe(a)opensuse.org
Um den Listen Administrator zu erreichen, schicken
Sie eine Mail an: opensuse-de+owner(a)opensuse.org