Archiv verlassen und diese Seite im Standarddesign anzeigen : Nächstes AWK Problem - Zeilen verketten
bass.bass
13-12-2006, 09:55
Hallo ich möchte folgende Zeilen zu einer Zeile verketten.
Es soll jeweils nur eine Zeile per "select" dabei herauskommen.
select geh_name from tagestour where mandant_id=? and tournummer=? and
orgeinheit_id=? and tourdatum=?
select parameterwert from steuerparameter where mandant_id = ? and parametertyp
= ? and parameterschluessel = ?
select parameterwert from steuerparameter where mandant_id = ? and parametertyp
= ? and parameterschluessel = ?
select parameterwert from steuerparameter where mandant_id = ? and parametertyp
= ? and parameterschluessel = ?
Da kann mir nur der AWK-Profi helfen.
Danke im Vorraus.
Romanday
13-12-2006, 12:38
Da kann mir nur der AWK-Profi helfen.
Danke im Vorraus.
Ich bin der Einzige der so etwas kann.
Wir haben hier viele gute Leute im Forum.:D
awk '{if($1!~/^select/){ORS="\n"}else{ORS=""}print $0}'
bass.bass
13-12-2006, 15:33
Ich bin der Einzige der so etwas kann.
Wir haben hier viele gute Leute im Forum.
Hey das funktioniert ja . ;)
Wenn aber der "Select"-Zeile mehrere Zeilen ohne "Select" am Anfang folgen s.u., dann funktioniert das nicht mehr. Es wird nur die erste Folgezeile der "Select"-Zeile angehängt und die restlichen Zeilen werden einzeln ausgegeben.
Es sollen am Ende nur Zeilen herauskommen, die mit select am Anfangen.
select geh_name from tagestour where mandant_id=? and tournummer=? and
orgeinheit_id=? and tourdatum=?
orgeinheit_id=? and tourdate=?
orgeinheit_d=? and tourdate=?
select parameterwert from steuerparameter where mandant_id = ? and parametertyp
= ? and parameterschluessel = ?
select parameterwert from steuerparameter where mandant_id = ? and parametertyp
= ? and parameterschluessel = ?
select parameterwert from steuerparameter where mandant_id = ? and parametertyp
= ? and parameterschluessel = ?
Moin moin,
Wenn aber der "Select"-Zeile mehrere Zeilen ohne "Select" am Anfang folgen s.u., dann funktioniert das nicht mehr. Es wird nur die erste Folgezeile der "Select"-Zeile angehängt und die restlichen Zeilen werden einzeln ausgegeben.
wenn es Dir nichts ausmacht, daß mehrere whitespaces zu einem Leerzeichen zusammengefasst werden, kannst Du es mal so probieren:
#!/bin/bash
X=""
for I in `cat foo`; do
if [ $I = select ]; then
test ! -z "$X" && echo $X
X=$I
else
X="$X $I"
fi
done
echo $X
...ganz ohne awk ;)
MfG,
Romanday
17-12-2006, 14:49
...ganz ohne awk ;)
MfG,
Das sieht sehr gut aus. :D
Jetzt fehlt nur noch die awk und SED Version.
Jetzt fehlt nur noch die awk und SED Version.
yep, da bin ich auch schon gespannt.:D
MfG,
Romanday
17-12-2006, 16:39
yep, da bin ich auch schon gespannt.:D
MfG,
Die Lösung hatte ich schon selben Tag, aber ich warte noch ein
wenig ob auch andere User auf den Zug mit raufspringen.
Wir haben doch hier genug Spezialisten.
Dann macht das doch mehr Spaß, als wenn man alles vorverdaut.:D
Waxolunist
18-12-2006, 09:36
Also gut damit dieser Thread auch einem Ende zugeführt wird, hier ist meine Lösung für das Problem mit sed:
sed '/select.*$/N;s/\n/ /'
Hoffe, ich hab das Problem richtig verstanden.
Aber das mehrzeilige is noch ein wenig schwierig
Waxolunist
18-12-2006, 12:01
Mit einem kleinen Trick gehts, aber mit sed alleine hab ichs noch nicht.
Zuerst lösche ich alle newlines mit
tr -d '\n'
dann ersetze ich alle selects durch newline + select
sed 's/select/\
select/g'
Wie kann ich mit sed alle terminating newlines löschen?
Waxolunist
18-12-2006, 12:09
Jetzt hab ich die komplette Lösung in sed. Manchmal läßt es einen einfach nicht los.
Ein bisschen googlen hilft:
cat test | sed ':a;N;$!ba;s/\n/ /g' | sed 's/select/\
select/g' > test.out
Wobei in test folgendes steht:
select geh_name from tagestour where mandant_id=? and tournummer=? and
orgeinheit_id=? and tourdatum=?
orgeinheit_id=? and tourdate=?
orgeinheit_d=? and tourdate=?
select parameterwert from steuerparameter where mandant_id = ? and parametertyp
= ? and parameterschluessel = ?
select parameterwert from steuerparameter where mandant_id = ? and parametertyp
= ? and parameterschluessel = ?
select parameterwert from steuerparameter where mandant_id = ? and parametertyp
= ? and parameterschluessel = ?
lg, christian
Romanday
18-12-2006, 16:50
Jetzt hab ich die komplette Lösung in sed. Manchmal läßt es einen einfach nicht los.
lg, christian
Katze aus Sack hohlen.:D
awk '{if($1 ~/^select/ && NR > 1){$0= "\n"$0};ORS="";print $0}'
Im Grunde ist es ganz einfach, nur auf die Idee muß man kommen.
Wer Spaß daran hat, ändert die AWK Zeile das Sie auch mit unterschiedlichen Variationen von Groß- und Kleinschreibung funktioniert.
bass.bass
20-12-2006, 07:14
Vielen Dank an alle Mitwirkenden.
Dann werde ich am Montag die Shell-Variante , Dienstag SED und Mittwoch AWK verwenden. ;)
Vielen Dank nochmal
Gruß Henrik
p.s. Frohes Fest! :D
so Du es auch nicht mehr brauchst... d.h., vllt ja am Donnerstag :D
ich hab' mir inzwischen awk einmal ein wenig angesehen, und dann viel mir dieses Problem als prima Uebung ein;)
awk '{if($1=="select") printf("\n"); printf("%s",$0)}' foo
@Romanday: hattest natuerlich Recht, selber nachdenken macht viel mehr Spass :D
Und was man mit diesem awk alles so anstellen kann... :cool:
MfG,
Romanday
31-01-2007, 06:17
awk '{if($1=="select") printf("\n"); printf("%s",$0)}' foo
MfG,
printf ist auch tricki, auf die Idee bin ich nicht gekommen.
Und was lernt man daraus?
Es gibt fast immer noch eine Steigerung?:D
Und was lernt man daraus?
Es gibt fast immer noch eine Steigerung?:D
ist es denn eine? kA wie awk das tatsächlich umsetzt...
Eigentlich hatte ich eher dieses Problem:
Manchmal läßt es einen einfach nicht los.
Eben;-)
MfG,
qeldroma
07-02-2007, 13:10
cat test | sed ':a;N;$!ba;s/\n/ /g' | sed 's/select/\
select/g' > test.out
Kann mir einer bitte mal "sed ':a;N;$!ba;s/\n/ /g'" übersetzen?
Das Einzige, was mir einleuchtet, ist das "/g" am Schluß. Aber wie funktioniert ":a;N;$!ba;s/\n"? das soll ja, wenn mich nicht alles täuscht, der Suchstring sein?
Grüße, Florian
Waxolunist
07-02-2007, 15:52
Na dann versuchen wir das mal aufzulösen. Es sieht kryptisch aus, das gebe ich zu. Aber ein bisschen ist das auch gewollt.
sed ':a;N;$!ba;s/\n/ /g'
Kann man auch in ein Skript packen. Das liefer ich vielleicht noch nach, wenn ich Zeit habe.
Ansonsten folgenes:
:a - Sprungmarke mit dem Namen a
; - Zeilenende
N - schreibe nächste Zeile aus dem InputStream in den pattern space, siehe auch man sed
; - Zeilenende
$ - lese nächste aus dem InputStream
! - Alle Zeilen ausschliesslich der in adresse (hier $) angegebenen
Zeilen.
ba - Branch to label; if label is omitted, branch to end of script. Jetzt geht man also wieder zu a.
; - Zeilenende
Bis hierher alles klar? Jetzt habe ich alles in einem einzigen Stream. Jetzt muss man nur mehr ersetzen.
Und zwar
s/ suche im pattern space nach dem zeichen \n
ersetze es durch ' '
/g ende
Aus man sed:
n N Read/append the next line of input into the pattern space.
$ Match the last line.
Im Tutorial auf Seite 24 werden die Adressräume halbwegs verständlich erklärt.
man sed (http://unixhelp.ed.ac.uk/CGI/man-cgi?sed)
Gutes deutsches Tutorial (http://www.tty1.net/sed-tutorium/html/sed-tutorium.pdf)
mfg, Christian
qeldroma
08-02-2007, 09:36
:eek:
Ich verneige mich in TIEFER Ehrfurcht!!!
Ich lerne gerade, daß ich sed noch nicht mal in Ansätzen richtig nutze:D
Und ich hielt mich für gut ;)
Grüße, Florian
Waxolunist
08-02-2007, 10:56
Danke für die Blumen.
Aber wie gesagt, das :a;N;$!ba; habe ich auch erst ergoogeln müssen. Weil vor allem das $! ist sehr mächtig, und dessen Mächtigkeit wird nur mehr von seiner Unverständlichkeit übertroffen :)
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.