per Nawk *mehrzeilige* Ausgabe Dateien aus *mehrzeiliger* Eingabedateien

04/03/2009 - 14:04 von Celal Dikici | Report spam
Hallo Gruppe,

Ich habe zwar Erfahrung mit Shell-Programmierung, aber mit awk/nawk
habe ich nicht weitergehende Erfahrung,
als die Grundlegende, die man so hat.


wenn ich aus einer CSV Datei heraus eine andere, z.B. SQL Datei,
erstelle,
kann ich Zeilenweise arbeiten und jede einzelne Spalte per awk/cut
erfassen. um danach ein SQL-Statement zu erstellen

z.B. Deal_Id=`expr ${ZEILE} | nawk -F";" '{ print $1 }'`
ShortName=`expr ${ZEILE} | nawk -F";" '{ print $2 }'` u.s.w. u.s.f.

Dies dauert natürlich; und je größer eine Eingabedatei, desto lànger
(alleine das einfache Einlesen mit echo-Ausgabe dauert über 3h in dem
u.g. Beispieldatei).

Direkt per nawk geht das erheblich schneller. Das untere macht bei
einem meiner anderen Programme, statt Minuten in ein par Sekunden
(die Pipes werden im nàchsten Schritt per sed durch " ersetzt. ich
wusste nicht, wie ich " im awk aussgebe, so habe ich | als krücke
genommen)

# per nawk SQL Code erstellen
nawk -F";" -v file=${SQLFile} '!/^#/ && NR {
print "INSERT INTO printreport..ZW_GPDaten VALUES( |" $1 "|,|" $2 "|,
NULL, |" $4 "|,|" $5 "|,|" $6 "|, convert( datetime, |"$7"|, 104), |"
$8 "|, NULL, NULL, NULL )" >> file }' ${LocalFile}

OK. das war einfach. Aber wie geht das mit mehrzeiligen Ausgabe?
(Hintergrund: es soll ein für eine Anwendung Import File erstellt
werden; s.u. )

Also los gehts:

1- ich habe eine Datei [A]; die ist ca. 8-10 MB groß und enthàlt ca.
150.000 Zeilen, nach dem Muster
(ohne Header, die habe ich grad selber hinzugefügt)

Lieferda;Cur;DownloadKey ;ZahlDat ;ZahlWert
20090202;USD;S30M0050200000_USD;31/03/2009;36718.84
20090202;USD;S30M0050200000_USD;07/04/2009;491.10
20090202;EUR;S30M0050201100_EUR;10/02/2009;18194.48
20090202;GBP;S30M0050201100_GBP;09/02/2009;969.26
20090202;GBP;S30M0050201100_GBP;19/02/2009;2249.07
20090202;GBP;S30M0050201100_GBP;25/02/2009;4388.49
u.s.w.. 150.000 Zeilen

2- daraus separiere ich eine art Steuerdatei [B]. Diese enthàlt dann
NUR die Spalte (DownloadKey)
aus [A], die per | sort | uniq formatiert wird. Also

S30M0050200000_USD
S30M0050201100_EUR
S30M0050201100_GBP
u.s.w.. 1650 Zeilen


Diese Datei [B] enthàlt daraufhin ca. 1650 Zeilen; und wird nun
benutzt, um aus der Datei [A] die jeweiligen
ZahlWert Zeilen heraus-zu-greppen und in eine andere temporàre
Datei [C] umzuleiten.
Also: foreach Zeile in-Datei-[B] grep $DownloadKey Datei-[A] >
datei-[C]

und jetzt kommt's:

3- ich will nun diese Datei [C] benutzen und daraus eine Mehrzeilige
Ausgabe-Textdatei erstellen. Wenn wir uns kurz
die ersten beiden Zeilen (USD) von dem obigen Ausgabe-Beispiel
anschauen, dann stelle ich mir das konkret so vor:

TBL Amort_0
PaymentDate 31/03/2009
Amount 36718.84
EOT

TBL Amort_1
PaymentDate 07/04/2009
Amount 491.10
EOT
...u.s.w. bis Amort_N Zeilen (N = LineCount of file [C]

Somit ist die Frage:

wie sehe das in awk/nawk aus - Eine mehrzeilige Ausgabe aus
mehrzeiliger Eingabedatei ? oder habt ihr andere Ideen/Vorschlàge?
müsste doch möglich sein, so mit for Schleife, oder?


In großer Erwartung eurer Antworten sage ich jetzt schonmal DANKE

Celal
 

Lesen sie die antworten

#1 Steffen Schuler
04/03/2009 - 15:28 | Warnen spam
This is an OpenPGP/MIME signed message (RFC 2440 and 3156)

Hi,

Celal Dikici wrote:
[...] ich
wusste nicht, wie ich " im awk aussgebe, so habe ich | als krücke
genommen)



mit

print "...\"..."

kann man ein Anfuehrungszeichen in AWK ausgeben.

[...]

Lieferda;Cur;DownloadKey ;ZahlDat ;ZahlWert
20090202;USD;S30M0050200000_USD;31/03/2009;36718.84
20090202;USD;S30M0050200000_USD;07/04/2009;491.10
20090202;EUR;S30M0050201100_EUR;10/02/2009;18194.48
20090202;GBP;S30M0050201100_GBP;09/02/2009;969.26
20090202;GBP;S30M0050201100_GBP;19/02/2009;2249.07
20090202;GBP;S30M0050201100_GBP;25/02/2009;4388.49
u.s.w.. 150.000 Zeilen

2- daraus separiere ich eine art Steuerdatei [B]. Diese enthàlt dann
NUR die Spalte (DownloadKey)
aus [A], die per | sort | uniq formatiert wird. Also

S30M0050200000_USD
S30M0050201100_EUR
S30M0050201100_GBP
u.s.w.. 1650 Zeilen


Diese Datei [B] enthàlt daraufhin ca. 1650 Zeilen; und wird nun
benutzt, um aus der Datei [A] die jeweiligen
ZahlWert Zeilen heraus-zu-greppen und in eine andere temporàre
Datei [C] umzuleiten.
Also: foreach Zeile in-Datei-[B] grep $DownloadKey Datei-[A] >
datei-[C]

und jetzt kommt's:

3- ich will nun diese Datei [C] benutzen und daraus eine Mehrzeilige
Ausgabe-Textdatei erstellen. Wenn wir uns kurz
die ersten beiden Zeilen (USD) von dem obigen Ausgabe-Beispiel
anschauen, dann stelle ich mir das konkret so vor:

TBL Amort_0
PaymentDate 31/03/2009
Amount 36718.84
EOT

TBL Amort_1
PaymentDate 07/04/2009
Amount 491.10
EOT
...u.s.w. bis Amort_N Zeilen (N = LineCount of file [C]

Somit ist die Frage:

wie sehe das in awk/nawk aus - Eine mehrzeilige Ausgabe aus
mehrzeiliger Eingabedatei ? oder habt ihr andere Ideen/Vorschlàge?
müsste doch möglich sein, so mit for Schleife, oder?
[...]



Das Ganze kann man mit folgendem Shell-Skript erledigen:

sort -t ';' -k 3,3 file |
nawk -F ';' '
{ print "TBL Amort_" (NR - 1)
print "PaymentDate", $4
print "Amount", $5
print "EOT"
}'

"" bedeutet dabei ein Zeilenende unter Unix/Linux. "file" ist dabei
die Eingabedatei "A".

Steffen Schuler (goedel)
Key ID: 0x42C5D853 / Key-server: pgp.mit.edu




Ähnliche fragen