Hallo Leute. Ich habe hier eine Liste vorliegen, die so aussieht: [...] 63831..63833 63835..63839 [...] Insgesamt hat das Dings etwa 1500 Zeilen. Die zwei Punkte zwischen den Zahlen sind als "bis" zu verstehen. Ich müßte diese Liste nun in folgendes Format umwandeln: 63831 83832 63833 83835 63836 63837 63838 63839 Besteht da eine einfache Möglichkeit, das mit awk zu realisieren? Oder wird das sehr trickreich? Da ich awk noch gar nicht kenne, wüßte ich gern vorher, ob der Zeitaufwand vertretbar ist. Danke+Gruß. Andy -- Antworten an lists@feile.net werden in /dev/null archiviert! Bitte ggf. lists... durch mail... ersetzen. Andreas Feile www.feile.net
Andreas Feile <lists@feile.net>
Ich habe hier eine Liste vorliegen, die so aussieht:
[...] 63831..63833 63835..63839 [...]
Insgesamt hat das Dings etwa 1500 Zeilen. Die zwei Punkte zwischen den Zahlen sind als "bis" zu verstehen. Ich müßte diese Liste nun in folgendes Format umwandeln:
63831 83832 63833 83835 63836 63837 63838 63839
Besteht da eine einfache Möglichkeit, das mit awk zu realisieren? Oder wird das sehr trickreich? Da ich awk noch gar nicht kenne, wüßte ich gern vorher, ob der Zeitaufwand vertretbar ist.
muß es awk sein, oder reicht sh auch: sed -e's/\.\./ /' < datei | while read a b; do seq $a $b; done Bye Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 9204871 Fax: +49(721) 24874 Juergen.Vollmer@[informatik-vollmer.de|alumni.uni-karlsruhe.de|acm.org] www.informatik-vollmer.de
ich:
sed -e's/\.\./ /' < datei | while read a b; do seq $a $b; done
noch kürzer: IFS="\.\."; while read a b; do seq $a $b; done < datei Bye Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 9204871 Fax: +49(721) 24874 Juergen.Vollmer@[informatik-vollmer.de|alumni.uni-karlsruhe.de|acm.org] www.informatik-vollmer.de
Hallo Jürgen, Dr. Jürgen Vollmer, Montag, 7. Juni 2004 13:32:
ich:
sed -e's/\.\./ /' < datei | while read a b; do seq $a $b; done
Leider nicht: seq: ungültiges Fließkommaargument: 17601 17607
IFS="\.\."; while read a b; do seq $a $b; done < datei
Leider ebenfalls nicht, selber Fehler wie oben. Danke+Gruß. Andy -- Antworten an lists@feile.net werden in /dev/null archiviert! Bitte ggf. lists... durch mail... ersetzen. Andreas Feile www.feile.net
Hallo, interessantes Problem ... Am Montag, 7. Juni 2004 17:06 schrieb Andreas Feile:
Hallo Jürgen,
Dr. Jürgen Vollmer, Montag, 7. Juni 2004 13:32:
ich:
sed -e's/\.\./ /' < datei | while read a b; do seq $a $b; done
Leider nicht: seq: ungültiges Fließkommaargument: 17601 17607
ich hab in einer shell folgendes probiert: echo "3..5" | sed -e's/\.\./ /' | while read a b; do seq $a $b; done was statt einer datei einen simplen 'echo' also input hat. Und: geht! ich vermute du hast beim abtippen einen '.' oder ein ' ' zuwenig/zuviel erwischt.
IFS="\.\."; while read a b; do seq $a $b; done < datei
Leider ebenfalls nicht, selber Fehler wie oben.
Danke+Gruß. Andy
-- Antworten an lists@feile.net werden in /dev/null archiviert! Bitte ggf. lists... durch mail... ersetzen.
Andreas Feile www.feile.net
-- MfG Rolf Masfelder EMail: rolf.masfelder@nector.de
mir ist das was aufgefallen, die bash möchte meistens um das ; ein leerzeichen versuch mal sed -e's/\.\./ /' < datei | while read a b ; do seq $a $b ; done Andreas Feile wrote:
Hallo Jürgen,
Dr. Jürgen Vollmer, Montag, 7. Juni 2004 13:32:
ich:
sed -e's/\.\./ /' < datei | while read a b; do seq $a $b; done
Leider nicht: seq: ungültiges Fließkommaargument: 17601 17607
IFS="\.\."; while read a b; do seq $a $b; done < datei
Leider ebenfalls nicht, selber Fehler wie oben.
Danke+Gruß. Andy
ich:
sed -e's/\.\./ /' < datei | while read a b; do seq $a $b; done
Andreas Feile <lists@feile.net>
Leider nicht: seq: ungültiges Fließkommaargument: 17601 17607
das passiert wen man an der Variablen IFS vorher "gedreht" hat. Wenn man IFS=" \t\n"; davor setzt, dann geht's (IFS=<space><tab><newline> ist der Default). ich:
IFS="\.\."; while read a b; do seq $a $b; done < datei
Andreas Feile <lists@feile.net>
Leider ebenfalls nicht, selber Fehler wie oben.
Das funktioniert anscheinend doch nicht. Irgendwie tat' beim testen, aber .... Bye Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 9204871 Fax: +49(721) 24874 Juergen.Vollmer@[informatik-vollmer.de|alumni.uni-karlsruhe.de|acm.org] www.informatik-vollmer.de
On Monday 07 June 2004 11:54, Andreas Feile wrote:
Hallo Leute.
Ich habe hier eine Liste vorliegen, die so aussieht:
[...] 63831..63833 63835..63839 [...]
Insgesamt hat das Dings etwa 1500 Zeilen. Die zwei Punkte zwischen den Zahlen sind als "bis" zu verstehen. Ich müßte diese Liste nun in folgendes Format umwandeln:
63831 83832 63833 83835 63836 63837 63838 63839
Besteht da eine einfache Möglichkeit, das mit awk zu realisieren? Oder wird das sehr trickreich? Da ich awk noch gar nicht kenne, wüßte ich gern vorher, ob der Zeitaufwand vertretbar ist.
Kleine perl-Lösung: --- cut here --- #!/usr/bin/perl while (<>) { chomp; ($from,$to)= ($_=~ m/\s*(\d*)\.\.(\d*)/); for ($i=$from; $i<=$to; $i++) { print "$i\n"; } } --- cut here --- Aufruf mit "Names_des_Perl_Skripts Name_der_inputdatei" Andreas
Hallo, Am Mon, 07 Jun 2004, Andreas Feile schrieb:
Besteht da eine einfache Möglichkeit, das mit awk zu realisieren? Oder wird das sehr trickreich? Da ich awk noch gar nicht kenne, wüßte ich gern vorher, ob der Zeitaufwand vertretbar ist.
awk -F "\." '{ for(i=$1; i<=$3; i++) { print i; } }' -dnh --
Ich habe folgende Frage: Wie lautet der Imperativ von "erschrecken"? "Buh!" -- S. Doerner und R. Radermacher in desd
David Haller, Montag, 7. Juni 2004 15:02:
awk -F "\." '{ for(i=$1; i<=$3; i++) { print i; } }'
Das hat mich auf die richtige Idee gebracht. Ich habe meine Liste (die komplizierter war als ich es beschrieben hatte) so umformatiert, daß mir folgendes _fast_ das richtige Ergebnis liefert: awk -F "\," '{ for(i=$3; i<=$4; i++) \ { print $1, $2, i, $5, $6, $7 ; } }' OFS="\," < PLZ > Output Was mir jetzt noch fehlt ist eine Möglichkeit, daß awk beim Auswurf nicht nur ein newline, sondern auch ein cr als Datensatztrenner benutzt (die Daten müssen zurück zu Windows). Wie mache ich awk das klar? Ein ...ORS="cr" wird wohl kaum gehen. Danke+Gruß. -- Antworten an lists@feile.net werden in /dev/null archiviert! Bitte ggf. lists... durch mail... ersetzen. Andreas Feile www.feile.net
Andreas Feile <lists@feile.net>
Ich habe meine Liste (die komplizierter war als ich es beschrieben hatte) so
wäre schön, wenn man das erfährt bevor man sich eine Lösung ausdenkt :-(
Was mir jetzt noch fehlt ist eine Möglichkeit, daß awk beim Auswurf nicht nur ein newline, sondern auch ein cr als Datensatztrenner benutzt (die Daten müssen zurück zu Windows). Wie mache ich awk das klar? Ein ...ORS="cr" wird wohl kaum gehen.
printf " %s %s ..... \r\n"; Bye Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 9204871 Fax: +49(721) 24874 Juergen.Vollmer@[informatik-vollmer.de|alumni.uni-karlsruhe.de|acm.org] www.informatik-vollmer.de
Hallo, Am Mon, 07 Jun 2004, Andreas Feile schrieb:
Was mir jetzt noch fehlt ist eine Möglichkeit, daß awk beim Auswurf nicht nur ein newline, sondern auch ein cr als Datensatztrenner benutzt (die Daten müssen zurück zu Windows). Wie mache ich awk das klar? Ein ...ORS="cr" wird wohl kaum gehen.
awk 'BEGIN { ORS="\r\n"; } ...' -dnh --
Es ist offensichtlich, daß die Katze an Rechner interessiert ist. Richte ihr einen eigenen Account ein. Sie ist nicht an einem Account interessiert, sondern an den interessanten Geräuschen, die der Dosenöffner vor dem Monitor von sich gibt. -- Rene Riech und Uwe Ohse
Hallo, Am Montag, 7. Juni 2004 18:21 schrieb Andreas Feile:
David Haller, Montag, 7. Juni 2004 15:02:
awk -F "\." '{ for(i=$1; i<=$3; i++) { print i; } }'
Das hat mich auf die richtige Idee gebracht. Ich habe meine Liste (die komplizierter war als ich es beschrieben hatte) so umformatiert, daß mir folgendes _fast_ das richtige Ergebnis liefert:
awk -F "\," '{ for(i=$3; i<=$4; i++) \ { print $1, $2, i, $5, $6, $7 ; } }' OFS="\," < PLZ > Output
Wie heisst die Datei: Post-Ort-Verzeichnis ;-)
Was mir jetzt noch fehlt ist eine Möglichkeit, daß awk beim Auswurf nicht nur ein newline, sondern auch ein cr als Datensatztrenner benutzt (die Daten müssen zurück zu Windows). Wie mache ich awk das klar? Ein ...ORS="cr" wird wohl kaum gehen.
Lass das, und verwende am Schluss einmal UNIX2DOS oder je nach Übertragungsweg auch einfach ftp mit transfer-Mode Ascii oder wenn schon Windoof dann Editor wie Ultraedit (o.ä.) und damit konvertieren. Nicht alle Änderungen auf einmal machen ...
Danke+Gruß.
-- Antworten an lists@feile.net werden in /dev/null archiviert! Bitte ggf. lists... durch mail... ersetzen.
Andreas Feile www.feile.net
-- MfG Rolf Masfelder EMail: rolf.masfelder@nector.de
Moin David. David Haller, Montag, 7. Juni 2004 15:02:
awk -F "\." '{ for(i=$1; i<=$3; i++) { print i; } }'
Wie ich gestern schon schrieb konnte ich mir mit diesem Denkanstoß etwas zusammenbauen, was gut funktioniert. Gut? Nicht ganz, denn: Die Quelltabelle hat 13390 Datensätze, die mittlerweile so aussehen: 01001;01465;Dresden;Dresden;Sachsen 01435;01445;Meißen-Radebeul;Dresden;Sachsen [+13388 weitere Datensätze] Lasse ich awk folgendermaßen drüberlaufen: awk -F "\;" '{ for(i=$1; i<=$2; i++) { print i, $3, $4, $5 ; } }' OFS="\;" < datei > output Dann stimmen die ersten paar hundert oder auch paar Tausend Datensätze. Aber irgendwann verschluckt sich awk offenbar, und es stehen Werte zusammen in einer Output-Zeile, die in der Input-Tabelle nicht in einer Zeile standen. Ich habe das mehrfach überprüft, die Quelldatei ist OK. Es sieht für mich so aus, als würde awk die Zeilen plötzlich durcheinanderbringen. Frage: habe ich bei awk ein Überlaufproblem, oder sowas in der Art? Denn wenn ich awk über eine Quelle mit nur ein paar Zeilen drüberjage, dann stimmt alles völlig einwandfrei Ratlos. Andy -- Antworten an lists@feile.net werden in /dev/null archiviert! Bitte ggf. lists... durch mail... ersetzen. Andreas Feile www.feile.net
On Tuesday 08 June 2004 11:50, Andreas Feile wrote:
Moin David.
David Haller, Montag, 7. Juni 2004 15:02:
awk -F "\." '{ for(i=$1; i<=$3; i++) { print i; } }'
Wie ich gestern schon schrieb konnte ich mir mit diesem Denkanstoß etwas zusammenbauen, was gut funktioniert. Gut? Nicht ganz, denn:
Die Quelltabelle hat 13390 Datensätze, die mittlerweile so aussehen:
01001;01465;Dresden;Dresden;Sachsen 01435;01445;Meißen-Radebeul;Dresden;Sachsen [+13388 weitere Datensätze]
Lasse ich awk folgendermaßen drüberlaufen:
awk -F "\;" '{ for(i=$1; i<=$2; i++) { print i, $3, $4, $5 ; } }' OFS="\;" < datei > output
Dann stimmen die ersten paar hundert oder auch paar Tausend Datensätze. Aber irgendwann verschluckt sich awk offenbar, und es stehen Werte zusammen in einer Output-Zeile, die in der Input-Tabelle nicht in einer Zeile standen. Ich habe das mehrfach überprüft, die Quelldatei ist OK. Es sieht für mich so aus, als würde awk die Zeilen plötzlich durcheinanderbringen.
Frage: habe ich bei awk ein Überlaufproblem, oder sowas in der Art? Denn wenn ich awk über eine Quelle mit nur ein paar Zeilen drüberjage, dann stimmt alles völlig einwandfrei
Deswegen mache ich seit langem nur noch kleine Sachen mit awk und alles andere mit Perl (ist dann sowieso schneller; ich hatte da mal ein sehr erhellendes Erlebnis mit awk im Zusammenspiel mit grossen Datenmengen): --- cut here --- #!/usr/bin/perl while (<>) { chomp; @F=split ";", $_; for ($i=$F[0]; $i<=$F[1]; $i++) { print "$i, $F[2], $F[3], $F[4]\n"; } } --- cut here --- versuchs mal: Aufruf wieder mit "skriptname inputdateiname > ouput" Andreas
Am Dienstag, 8. Juni 2004 12:18 schrieb Andreas Kyek: [...]
Deswegen mache ich seit langem nur noch kleine Sachen mit awk und alles andere mit Perl (ist dann sowieso schneller; ich hatte da mal ein sehr erhellendes Erlebnis mit awk im Zusammenspiel mit grossen Datenmengen): [...]
Das stimmt so allgemein nicht. Ich habe selbst schon Sachen gebaut, die im awk (auch über große Dateien) schneller liefen als in Perl. Es kommt immer auf die Aufgabe und die Umsetzung an - awk wird zum Beispiel dann langsam, wenn man im END-Abschnitt noch über große assoziative Arrays sortiert. Dann ist Perl sicher schneller - aber guck Dir in solchen Fällen mal den Ressourcenverbrauch an ;-) Ich habe schon erlebt, dass ein von mir gebautes Perl-Script mit umfangreichen Hashes (mehrere 10.000 Einträge) eine Solaris-Kiste mit 4 GB und 2 Prozessoren restlos ausgelastet hat. Jan
Andreas Feile, Dienstag, 8. Juni 2004 11:50:
Frage: habe ich bei awk ein Überlaufproblem, oder sowas in der Art? Denn wenn ich awk über eine Quelle mit nur ein paar Zeilen drüberjage, dann stimmt alles völlig einwandfrei
Wie ich soeben festgestellt habe, liegt in der Quelldatei eine Besonderheit vor, die sich auch nicht beheben läßt. Vermutlich ist also awk unschuldig. -- Antworten an lists@feile.net werden in /dev/null archiviert! Bitte ggf. lists... durch mail... ersetzen. Andreas Feile www.feile.net
Hallo, Am Tue, 08 Jun 2004, Andreas Feile schrieb:
Moin David.
David Haller, Montag, 7. Juni 2004 15:02:
awk -F "\." '{ for(i=$1; i<=$3; i++) { print i; } }'
Wie ich gestern schon schrieb konnte ich mir mit diesem Denkanstoß etwas zusammenbauen, was gut funktioniert. Gut? Nicht ganz, denn:
Die Quelltabelle hat 13390 Datensätze, die mittlerweile so aussehen:
01001;01465;Dresden;Dresden;Sachsen 01435;01445;Meißen-Radebeul;Dresden;Sachsen [+13388 weitere Datensätze]
Lasse ich awk folgendermaßen drüberlaufen:
awk -F "\;" '{ for(i=$1; i<=$2; i++) { print i, $3, $4, $5 ; } }' ^^^^
Willst du '\' als Trennzeichen? awk -F';' '{ for( i=$1; i <= $2; i++ ) { printf "%05i;%s;%s;%s\r\n" i, $3, $4, $5; } }' Ist denn die zweite Zahl immer vorhanden und groesser als die erste? Sonst muesste man diese Sonderfaelle beachten.
Frage: habe ich bei awk ein Überlaufproblem, oder sowas in der Art?
Das auch, aber bei Postleitzahlen muesste das gehen. -dnh --
Anschließend schaltest du deinen PC aus und hängst dich auf. Oder umgekehrt Nach reiflicher Überlegung habe ich meinen PC an die Decke gehängt, kann aber jetzt meinen Ausschalter nicht finden. Was mache ich falsch? [Dieter Bruegmann und Eugen Schabenberger in dag°]
participants (7)
-
Andreas Feile
-
Andreas Kyek
-
Daniel Gompf
-
David Haller
-
Dr. Jürgen Vollmer
-
Jan.Trippler@t-online.de
-
Rolf Masfelder