PDA

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 = ?

rais
17-12-2006, 13:20
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.

rais
17-12-2006, 15:01
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

rais
04-01-2007, 21:00
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

rais
04-02-2007, 01:14
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 :)