Hallo MitLISTige, Ich habe hier eine kleine Aufgabe geerbt... Gegeben sind zwei (Text-)Dateien: a) DB.txt: Eine CSV-Datei mit 15 Spalten/Trennzeichen ist ";" b) Vorlage.txt: Eine Textdatei, die "Spaltenbezeichner" enthält. (hier: [#01], [#02], ... [#15]) Aufgabe: Es soll eine Textdatei "Export.txt" erzeugt werden. Diese soll für jede Zeile aus DB.txt eine Kopie des Inhaltes von Vorlage.txt enthalten, bei der die Spaltenbezeichner durch die entsprechenden Inhalte von DB.txt ausgetauscht sind. Sozusagen ein Serienbriefdruck. Beispiel: DB.txt 1;2;3 4;5;9 2;7;9 Vorlage.txt Die Summe von [#01] und [#02] ist [#03]. => Export.txt Die Summe von 1 und 2 ist 3. Die Summe von 4 und 5 ist 9. Die Summe von 2 und 7 ist 9. Randbedingungen: Die Spaltenbezeichner kommen alle genau ein Mal in Vorlage.txt vor (keine Spalte wird ausgelassen, Kein Bezeichner doppelt). Zudem kommen sie genau aufeinanderfolgend vor. Später soll das Skript erweitert werden (mehrfaches Vorkommen der Bezeichner, nicht alle Spalten werden müssen vorkommen, die Reihenfolge soll beliebig sein. Ich brauche nur ein paar Meinungen und Denkanstöße: Welche Befehle/Programme sind meine Freunde... Gruß, Michael -- ____ / / / / /__/ Michael Höhne / / / / / / mih-hoehne@web.de / ________________________________/ -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Die, 29 Jan 2008, Michael Höhne schrieb: [..]
Beispiel:
DB.txt 1;2;3 4;5;9 2;7;9
Vorlage.txt
Die Summe von [#01] und [#02] ist [#03].
=> Export.txt
Die Summe von 1 und 2 ist 3. Die Summe von 4 und 5 ist 9. Die Summe von 2 und 7 ist 9. [..] Ich brauche nur ein paar Meinungen und Denkanstöße: Welche Befehle/Programme sind meine Freunde...
Perl + LaTeX :P Für obigen einfachen Fall tut's auch awk. ==== foo.awk ==== #!/usr/bin/gawk -f BEGIN { FS=";"; while ( getline l < "Vorlage.txt" ) { V=V l; } close("Vorlage.txt"); } { l = V; gsub(/\[#01\]/, $1, l); gsub(/\[#02\]/, $2, l); gsub(/\[#03\]/, $3, l); print l; } ==== $ gawk -f foo.awk DB.txt Die Summe von 1 und 2 ist 3. Die Summe von 4 und 5 ist 9. Die Summe von 2 und 7 ist 9. $ HTH, -dnh -- [die 1970er Jahre] Die Zeit, in der Joschka Fischer seine kriminelle Karierre beendete, und Helmut Kohl seine so richtig durchstartete... -- Matthias Brodowy im "SR Gesellschaftsabend" -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo David,
[...]
Ich brauche nur ein paar Meinungen und Denkanstöße: Welche Befehle/Programme sind meine Freunde...
Perl + LaTeX :P
O.K. das kommt mir entgegen... Dann kann ich in der Firma mit den Lobreden auf LaTeX fortfahren.
Für obigen einfachen Fall tut's auch awk.
So was in der Art hatte ich vermutet
[Skript]
Super! Ich muss mir endlich mal wieder Zeit nehmen und meine rudimentären Kommandozeilen-Kenntnisse aufpolieren. Mit bestem Dank, Michael -- ____ / / / / /__/ Michael Höhne / / / / / / mih-hoehne@web.de / ________________________________/ -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Die, 29 Jan 2008, David Haller schrieb: [..]
==== foo.awk ==== #!/usr/bin/gawk -f BEGIN { FS=";"; while ( getline l < "Vorlage.txt" ) { V=V l; } close("Vorlage.txt"); }
{ l = V; gsub(/\[#01\]/, $1, l); gsub(/\[#02\]/, $2, l); gsub(/\[#03\]/, $3, l); print l; } ====
Nachtrag: hier kann man natürlich noch Checks einbauen, z.B. sowas: ==== # ... { if( $1 + $2 != $3 ) { print "Fehler: "FILENAME "[" FNR "]: Summe stimmt nicht." > "/dev/stderr"; exit 1; } l = V; gsub(/\[#01\]/, $1, l); gsub(/\[#02\]/, $2, l); gsub(/\[#03\]/, $3, l); print l; } ==== -dnh --
Die Probleme dieser Welt begannen, als der erst kam! Der erste was? M-e-n-s-c-h [in detebe] -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo David,
Nachtrag: hier kann man natürlich noch Checks einbauen, z.B. sowas:
if( $1 + $2 != $3 ) { print "Fehler: "FILENAME "[" FNR "]: Summe stimmt nicht." > "/dev/stderr"; exit 1;
Die "Additionen" waren nur das erstbeste Beispiel das mir eingefallen ist :-) Aber trotzdem Dank für den Hinweis, denn es gibt tatsächlich einen Sonderfall, den ich berücksichtigen muss... Gruß, Michael -- ____ / / / / /__/ Michael Höhne / / / / / / mih-hoehne@web.de / ________________________________/ -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo David, nur fürs Archiv: Ich hatte nun eine mehrzeilige Vorlage bekommen. Durch das Zusammensetzen der Vorlage in AWK (V=V l;) gingen die Zeilenumbrüche verloren. Ich habe mir wie folgt beholfen: Der Klammeraffe taucht als Zeichen niemals auf, also habe ich V=V l; in V=V l "@"; geändert. Die @ zeigen an, wo wieder ein Zeilenvorschub rein muss. Im unteren Bereich ist dann ein gsub(/@/, "\n", l); dazugekommen, der das erledigt. Gruß, Michael -- ____ / / / / /__/ Michael Höhne / / / / / / mih-hoehne@web.de / ________________________________/ -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Die, 19 Feb 2008, Michael Höhne schrieb:
Ich hatte nun eine mehrzeilige Vorlage bekommen. Durch das Zusammensetzen der Vorlage in AWK (V=V l;) gingen die Zeilenumbrüche verloren.
Ich habe mir wie folgt beholfen: Der Klammeraffe taucht als Zeichen niemals auf, also habe ich V=V l; in V=V l "@"; geändert. Die @ zeigen an, wo wieder ein Zeilenvorschub rein muss.
Versuch's mit: V=V l"\n"; ;) -dnh -- Es wäre schon wünschenswert, wenn die DAUs das Stück toten Baum, was mit der Suse mitkommt, nutzen würden. Entweder zum Lesen, oder um sich damit so lange auf den Schädel zu hauen, bis die Kollegen vom RD anrücken müssen. -- Hauke Heidtmann in feuerwehrmann.talk -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo David,
Ich habe mir wie folgt beholfen: Der Klammeraffe taucht als Zeichen niemals auf, also habe ich V=V l; in V=V l "@"; geändert. Die @ zeigen an, wo wieder ein Zeilenvorschub rein muss.
Versuch's mit:
V=V l"\n";
;)
Logo!.... <Brett vorm Kopf wegnehm> ;-))) Gruß, Michael -- ____ / / / / /__/ Michael Höhne / / / / / / mih-hoehne@web.de / ________________________________/ -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo Michael, On Tuesday 29 January 2008 23:10:51 Michael Höhne wrote:
Ich habe hier eine kleine Aufgabe geerbt...
Habe einen kleinen Ansatz fuer dich: #!/bin/bash declare -a c tr ';' ' ' <DB.txt | \ while read line do c=(0 $line) eval echo "$(cat Vorlage.txt | sed 's/\[#0*\([0-9]*\)\]/\${c[\1]}/g')" done Ergibt bei mir: Die Summe von 1 und 2 ist 3. Die Summe von 4 und 5 ist 9. Die Summe von 2 und 7 ist 9. Roman -- Roman Fietze Telemotive AG Büro Mühlhausen -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo Roman,
Habe einen kleinen Ansatz fuer dich:
[batch]
Auch dir vielen Dank für die Hilfe. Ich werde am Wochenende mal eine Bastelrunde einlegen... Gruß, Michael -- ____ / / / / /__/ Michael Höhne / / / / / / mih-hoehne@web.de / ________________________________/ -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
participants (3)
-
David Haller
-
Michael Höhne
-
Roman Fietze