Hilfe bei sed od. awk
Hallo liebe Listianer, Gegeben ist ein csv File mit ";" als Feldtrenner. Ich muß jetzt in der Spalte 4 die führenden Nullen entfernen. Mit sed habe ich das, weil es die erste Spalte war, geschafft. Aber wie kann ich das mittendrinnen machen? Beispiel: 00N1;Text;0003003381;0011810754;20111220;6000;CY02;Text;24,08 ^ Um diese Nullen geht's Bitte euch um Hilfe. Danke 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
Hallo Dahoam, Am Mittwoch, 21. Dezember 2011 15:57 schrieb Dahoam:
Hallo liebe Listianer,
Gegeben ist ein csv File mit ";" als Feldtrenner.
Ich muß jetzt in der Spalte 4 die führenden Nullen entfernen. Mit sed habe ich das, weil es die erste Spalte war, geschafft. Aber wie kann ich das mittendrinnen machen?
Beispiel:
00N1;Text;0003003381;0011810754;20111220;6000;CY02;Text;24,08 ^ Um diese Nullen geht's
Ich würde das vierte Feld mit cut rausschneiden: echo "00N1;Text;0003003381;0011810754;CY02;Text;" | cut -d ";" -f 4 liefert das vierte Feld 0011810754 Dann darauf Dein sed Kommando anwenden. Ich wünsche allen ein frohes und erholsames Fest und eien guten Rutsch! Herzliche Grüße! Rolf Muth Meine Adressen duerfen nicht fuer Werbung verwendet werden! PGP Public Key: http://pgp.mit.edu:11371/pks/lookup?op=get&search=0xF8DC41935544C89A fingerprint: C025 3071 8E56 F8F1 250A 5624 F8DC 4193 5544 C89A
On 12/21/2011 04:51 PM, Rolf Muth wrote:
Hallo Dahoam,
Am Mittwoch, 21. Dezember 2011 15:57 schrieb Dahoam:
Hallo liebe Listianer,
Gegeben ist ein csv File mit ";" als Feldtrenner.
Ich muß jetzt in der Spalte 4 die führenden Nullen entfernen. Mit sed habe ich das, weil es die erste Spalte war, geschafft. Aber wie kann ich das mittendrinnen machen?
Beispiel:
00N1;Text;0003003381;0011810754;20111220;6000;CY02;Text;24,08 ^ Um diese Nullen geht's Ich würde das vierte Feld mit cut rausschneiden:
echo "00N1;Text;0003003381;0011810754;CY02;Text;" | cut -d ";" -f 4
liefert das vierte Feld
0011810754
Dann darauf Dein sed Kommando anwenden.
Ich wünsche allen ein frohes und erholsames Fest und eien guten Rutsch! Herzliche Grüße! Rolf Muth Meine Adressen duerfen nicht fuer Werbung verwendet werden! PGP Public Key: http://pgp.mit.edu:11371/pks/lookup?op=get&search=0xF8DC41935544C89A fingerprint: C025 3071 8E56 F8F1 250A 5624 F8DC 4193 5544 C89A Vielen Dank für die Anregung.
Mir ist aber grad ein Geistesblitz eingeschlagen. Die Lösung funktioniert bestens: awk -F';' '{ gsub(/00/,"", $4); print }' < csvfile.csv > test.csv Wünsche ebenfalls allen ein frohes Fest und einen guten Rutsch ins Jahr 2012 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
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Andreas Miziolek [21.12.2011 17:18]:
On 12/21/2011 04:51 PM, Rolf Muth wrote:
Hallo Dahoam,
Am Mittwoch, 21. Dezember 2011 15:57 schrieb Dahoam:
Hallo liebe Listianer,
Gegeben ist ein csv File mit ";" als Feldtrenner.
Ich muß jetzt in der Spalte 4 die führenden Nullen entfernen. Mit sed habe ich das, weil es die erste Spalte war, geschafft. Aber wie kann ich das mittendrinnen machen?
Beispiel:
00N1;Text;0003003381;0011810754;20111220;6000;CY02;Text;24,08 ^ Um diese Nullen geht's Ich würde das vierte Feld mit cut rausschneiden:
echo "00N1;Text;0003003381;0011810754;CY02;Text;" | cut -d ";" -f 4
liefert das vierte Feld
0011810754
Dann darauf Dein sed Kommando anwenden.
Ich wünsche allen ein frohes und erholsames Fest und eien guten Rutsch! Herzliche Grüße! Rolf Muth Meine Adressen duerfen nicht fuer Werbung verwendet werden! PGP Public Key: http://pgp.mit.edu:11371/pks/lookup?op=get&search=0xF8DC41935544C89A
fingerprint: C025 3071 8E56 F8F1 250A 5624 F8DC 4193 5544 C89A Vielen Dank für die Anregung.
Mir ist aber grad ein Geistesblitz eingeschlagen. Die Lösung funktioniert bestens:
awk -F';' '{ gsub(/00/,"", $4); print }' < csvfile.csv > test.csv
oder auch awk -F';' '{ printf ("%d\n", $4); }' < csvfile.csv > test.csv Gruß Werner -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.18 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iEYEARECAAYFAk7yCEwACgkQk33Krq8b42N/KACfSaAp0nUNoqGeoW5fiHHxmi4x 4XwAn1OsOAunTMogxLj6qkaZYOVmXRNV =xWDe -----END PGP SIGNATURE----- -- 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
On 12/21/2011 05:24 PM, Werner Flamme wrote:
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
Andreas Miziolek [21.12.2011 17:18]:
On 12/21/2011 04:51 PM, Rolf Muth wrote:
Hallo Dahoam,
Am Mittwoch, 21. Dezember 2011 15:57 schrieb Dahoam:
Hallo liebe Listianer,
Gegeben ist ein csv File mit ";" als Feldtrenner.
Ich muß jetzt in der Spalte 4 die führenden Nullen entfernen. Mit sed habe ich das, weil es die erste Spalte war, geschafft. Aber wie kann ich das mittendrinnen machen?
Beispiel:
00N1;Text;0003003381;0011810754;20111220;6000;CY02;Text;24,08 ^ Um diese Nullen geht's Ich würde das vierte Feld mit cut rausschneiden:
echo "00N1;Text;0003003381;0011810754;CY02;Text;" | cut -d ";" -f 4
liefert das vierte Feld
0011810754
Dann darauf Dein sed Kommando anwenden.
Ich wünsche allen ein frohes und erholsames Fest und eien guten Rutsch! Herzliche Grüße! Rolf Muth Meine Adressen duerfen nicht fuer Werbung verwendet werden! PGP Public Key: http://pgp.mit.edu:11371/pks/lookup?op=get&search=0xF8DC41935544C89A
fingerprint: C025 3071 8E56 F8F1 250A 5624 F8DC 4193 5544 C89A Vielen Dank für die Anregung.
Mir ist aber grad ein Geistesblitz eingeschlagen. Die Lösung funktioniert bestens:
awk -F';' '{ gsub(/00/,"", $4); print }'< csvfile.csv> test.csv oder auch
awk -F';' '{ printf ("%d\n", $4); }'< csvfile.csv> test.csv
Gruß Werner -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.18 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
iEYEARECAAYFAk7yCEwACgkQk33Krq8b42N/KACfSaAp0nUNoqGeoW5fiHHxmi4x 4XwAn1OsOAunTMogxLj6qkaZYOVmXRNV =xWDe -----END PGP SIGNATURE----- Hallo Werner,
Ist natürlich noch einfacher. Danke auch für den Tip. Werd mich mal näher mit awk beschäftigen. Danke 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
Hallo, Am Wed, 21 Dec 2011, Werner Flamme schrieb:
awk -F';' '{ printf ("%d\n", $4); }' < csvfile.csv > test.csv
Siehe nebenan: Feldtrenner und du gibst nur noch die Spalte 4 aus. -dnh -- Too bloated to crash, it can only bounce gently into the limits set by the laws of physics and stop, wobbling slightly. -- unknown -- 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
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 David Haller [21.12.2011 18:36]:
Hallo,
Am Wed, 21 Dec 2011, Werner Flamme schrieb:
awk -F';' '{ printf ("%d\n", $4); }' < csvfile.csv > test.csv
Siehe nebenan: Feldtrenner und du gibst nur noch die Spalte 4 aus.
-dnh
Hallo David, sorry, nicht richtig gelesen - dachte, da sollte nur das 4. Feld zurückkommen. Deshalb spielte bei mir auch der Feldtrenner keine Rolle... Danke! Werner -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.18 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iEYEARECAAYFAk7yHJIACgkQk33Krq8b42N0/wCfa1elZHkeMCNToZSW9AY54bGs 4DMAnRCfHpa1YSCHIZX3G9gZG3CMDJyF =RBJL -----END PGP SIGNATURE----- -- 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
Hallo, Am Wed, 21 Dec 2011, Andreas Miziolek schrieb: [..]
Mir ist aber grad ein Geistesblitz eingeschlagen. Die Lösung funktioniert bestens:
awk -F';' '{ gsub(/00/,"", $4); print }' < csvfile.csv > test.csv
Leider falsch. Das schneidet alle 00 raus, egal wo im 4ten-Feld. Außerdem wird der Feldtrenner geändert. Bsp: $ echo '1;2;3;00010001001;' | awk -F';' '{ gsub(/00/,"", $4); print }' 1 2 3 01011 Korrekt wäre: awk 'BEGIN { FS = OFS = ";"; } { sub(/^0+/, "", $4); print; }' csvfile.csv > test.csv Oder eben: awk 'BEGIN { FS = OFS = ";" } { $4 = sprintf("%d", $4); print; }' csvfile.csv Ich würde tippen, daß die sprintf Variante schneller sein könnte. Müßte man testen. -dnh -- Die Bezeichnung Newbie ist also, wie schon soviele vor mir äußerten, keine Beleidigung sondern einfach eine Zustandsbeschreibung für einen bestimmten Wissensbereich. -- Jens Ott in suse-linux -- 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
On 12/21/2011 06:35 PM, David Haller wrote:
Hallo,
Am Wed, 21 Dec 2011, Andreas Miziolek schrieb: [..]
Mir ist aber grad ein Geistesblitz eingeschlagen. Die Lösung funktioniert bestens:
awk -F';' '{ gsub(/00/,"", $4); print }'< csvfile.csv> test.csv Leider falsch. Das schneidet alle 00 raus, egal wo im 4ten-Feld. Außerdem wird der Feldtrenner geändert. Bsp:
$ echo '1;2;3;00010001001;' | awk -F';' '{ gsub(/00/,"", $4); print }' 1 2 3 01011
Korrekt wäre:
awk 'BEGIN { FS = OFS = ";"; } { sub(/^0+/, "", $4); print; }' csvfile.csv> test.csv
Oder eben:
awk 'BEGIN { FS = OFS = ";" } { $4 = sprintf("%d", $4); print; }' csvfile.csv
Ich würde tippen, daß die sprintf Variante schneller sein könnte. Müßte man testen.
-dnh
Danke David, Das mit dem OFS bin ich dann auch noch draufgekommen. Werde mal auf deinen beiden Lösungen aufbauen. Vielen Dank nachmal. 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
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 Geht aber nur wenn $4 komplett aus Ziffern besteht ;) -- Gruss Bernd -- 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
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@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
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
participants (7)
-
Andreas Miziolek
-
Bernd Obermayr
-
Dahoam
-
David Haller
-
Privat
-
Rolf Muth
-
Werner Flamme