nochmal awk-Programmierung

Post Reply
Message
Author
LBS

nochmal awk-Programmierung

#1 Post by LBS »

Hallo zusammen,

ich will aus einer Datei die folgenden Aufbau hat:

name1
name2
name3
name4
.
.
.

Eine Ausgabe die folgendermaßen aussieht:

'name1','name2','name3','name4'

(ganz am Ende darf kein Komma stehen!)

Nun habe ich das ganze Folgendermaßen erledigt:

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
awk "{ print \"'\"; print $1; print \"'\" ; print \" ,\" }" text >text_neu
anz=`cat text_neu | wc -l | sed 's/ *//g'`
UID=`sed -n -e "$anz !p" text_neu | tr -d '
'`

</font><hr></pre></blockquote>
Der awk schreibt in die Datei text_neu vor jedem namen eine Zeile mit ' und nach jedem Namen eine Zeile mit ',
das Problem, am Ende der Datei ist dann noch ein Komma zu viel.
in der Variablen anz steht die Anzahl der Zeilen und mit dem zweiten sed schneide ich die letzte Zeile weg.
Der tr schneidet mir noch die Curage-Return-Zeichen weg und ich erhalte die gewollte Ausgabe.

Allerdings scheint mir das irgendwie recht umständlich, vielleicht ist hier ja ein Shell-Krebs unterwegs, der das eleganter lösen könnte,

danke

cu

LBS
___________________________

Linux Based System <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

Jochen

Re: nochmal awk-Programmierung

#2 Post by Jochen »

Da wird der awk aber schwer unterschätzt! <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
awk '
{ zeile = zeile "'\<!--no-->'','\<!--no-->''" $0 }
END { print substr (zeile, 3) "'\''" }' text
</font><hr></pre></blockquote>
In der Variablen zeile werden die Eingabezeilen gesammelt, getrennt durch "','". (Das Herumgepfriemele mit dem Hochkomma und dem Backslash ist notwendig, weil die Shell mit dem Hochkomma das Ende des Quotings, das mit "awk '" beginnt, sieht.) Zum Schluss wird die Zeile ausgeben. Da aber am Anfang zuviel steht, wird mittels substr nur der Teil der Zeichnekette ab dem 3. Zeichen inklusive (dem zweiten ') augegeben, plus dem hinten noch fehlenden '.

Ok so?

Jochen

LBS

Re: nochmal awk-Programmierung

#3 Post by LBS »

Nie würde ich den awk unterschätzen <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle"> !!!
Das Skript klappt wunderbar, aber noch zwei Fragen dazu:
Wieso steht hier $0 und nicht $1. Ich hätte gedacht mit $1 hol ich mir den ersten Ausdruck aus einer Zeile.
Und 2tens, wo ist das Return Zeichen hin? Ich hab es ja extra mit dem tr rausgefiltert?

Danke

cu

LBS

Re: nochmal awk-Programmierung

#4 Post by LBS »

Noch was, hab ich in der Eile vergessen,

Wieso brauche ich hier kein BEGIN? Soviel ich weiß (anscheinend zu wenig), werden Anweisungen für den awk die vor dem Durchlauf passieren zwischen BEGIN und END angegeben?

danke

cu

Jochen

Re: nochmal awk-Programmierung

#5 Post by Jochen »

$0 steht für die gesamte Eingabezeile. Es könnte ja sein, dass in einer Zeile Deiner Eingabedatei "Peter Müller" steht. Wenn Du $1 verwendest, würde nur "Peter" übernommen werden; ein Blank ist ja per Default Feldtrenner. Bei $0 wird "Peter Müller" übernommen; die ganze Eingabezeile halt. Du kannst es also gerne so anpassen, wie es in Deinem Fall am besten hinkommt.

Die Newlines verschwinden, da für den awk das Newline der Satz-Trenner (Record Separator, in der Variablen RS definiert) ist. Ein Satztrenner ist per Definition niemals <i>Bestandteil</i> eines Satzes, also wird mittels $0 immer nur die Eingabezeile ohne Newline in der Variablen zeile aufaddiert. In der Ausgabe wird durch das print-Kommando nur noch zum Schluss eines drangehängt.

BEGIN und END sind lediglich spezielle Auswahlbedingungen. Die Aktion, die auf BEGIN folgt, wird ausgeführt, <i>bevor</i> auch nur die erste Eingabedatei bearbeitet wird. Dort werden typischerweise Variablen initialisiert oder Tabellenheader ausgegeben. Die Aktion, die auf END folgt, wird ausgeführt, <i>nachdem</i> die letzte Eingabedatei vollständig bearbeitet wurde. Dort werden typischerweise Endergebnisse berechnet und ausgegeben. BEGIN und END bilden keine Klammer; man kann beide oder keins oder auch nur eins von beiden verwenden, je nach Anwendungszweck.

Wenn Du noch weitere Infos zu awk suchst und einigermassen Englisch kannst, würde ich Dir ein "info gawk" empfehlen. Die Online-Doku zum gawk ist wirklich sehr gut.

Noch andere Unklarheiten? <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

Jochen

Post Reply