linux-l: awk Frage

Winfried Winkler willi at Hobbit.IN-Berlin.De
Fr Feb 16 01:28:04 CET 2001


Lutz Pflughaupt wrote:
> Folgende Situation:
> in der Datei tmp sind Daten, die bereits in feste Spalten aufgeteilt
> sind, insgesamt 11 Spalten mit fester Breite. Meine awk Zeile sorgt
> dafür, daß in der tmp1 alle Zeilen erscheinen, für die die Bedingung
> git. Das printf sorgt dafür, daß das gewünschte Ausgabeformat entsteht
> und im $11 die "1111" als Kennzeichnung entsteht.
> 
> awk '$3~/^016/||$3~/^018/||$3~/^019/
> {printf("%-2s%-4s%-16s%-4s%-4s%-2s%-2s%-24s%-8s%-8s%-5s
> \n",$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,"1111")}' tmp > tmp1
> 
> Jetzt sollen die Zeilen, die zuvor die Bedingung erfüllt hatten aus tmp
> entfernt werden.
> 
> im nächsten Schritt wollte ich einen weiteren awk
> '$3~/^007/.........,"2222")}' tmp > tmp2
> machen.
> u.s.w.
> Am Ende, wenn alles "gefunden" wurde sollte dann tmp leer sein.

hm.... man muesste sich mal durch die optionen der sed manpage wuehlen,
es ist spaet und ich hab die grad nicht zur hand :-)

klingt so, als ob es das einfachste waere, zuerst die zeilen abhaengig
vom pattern matching in 2 getrennte dateien "vorzusortieren" mit sed
und dann erst den awk auf das eine file anzusetzen.

d.h. nur wenn bedingung zutrifft, output nach stdout (hier dann awk
anschliessen, z.b. via pipe). wenn bedingung nicht zutrifft, statt
dessen via "w filename" command ausgabe in ein zweites file, in diesem
waseren die "richtigen" zeilen dann nicht mehr enthalten -- und das
urspruengl. quellfile kann sofort geloescht werden.
das ganze sollte sich via shellscript schleife dann auch einfach
kaskadieren lassen in mehrere durchgaenge (tmp1, tmp2,....)

hoffe, ich hab mich klar genug ausgedrueckt...

Gruesse,
  winfried



Mehr Informationen über die Mailingliste linux-l