in awk nach Werten filtern

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Rattlesnake
Beiträge: 17
Registriert: 20.06.2007 09:24:12

in awk nach Werten filtern

Beitrag von Rattlesnake » 12.10.2009 10:20:30

Hi @all,

ich bin gerade dabei mich in awk / sed einzulesen, doch ich sollte für meinen Arbeitgeber ein altes Script ändern, da dieses dringend benötigt wird.

Und zwar geht es um folgendes: Ich habe folgdenen Codeausschnitt

Code: Alles auswählen

    USERLIST=`sed -e 's/.*://' $PROACC/$PRO.acc | ${AWK} -F\, '{ for (i = 1; i <= NF; i++) print $i}' | sort -u | ${AWK} '
#build array of existing accounts
BEGIN {
        cmd = "ypcat passwd | sed 's/:.*//'"
        while (( cmd | getline ) > 0) {
        accountlis[$0] = $0
        }
}
{
          if ( $1 in accountlist ){
                printf("%s,",$1)
          }
}
'`
Dieser generiert mir aus einer datei $PRO.acc eine Userlist. Die $PRO.acc sieht z.B. so aus:

Code: Alles auswählen

pl_aktiv:horn,veikko
me_aktiv:agnes,andersso
re_aktiv:bagnuoli,bonello,buckmann,eberlein,herwig,werno
pl:franke,jung
re:graf
me:erich,farrugia,franke
st:B
Das argument st:B ist nun neu dazugekommen und gibt den status der Daten an. Da dies aber genau so aufgebaut ist, wie z.B. me_aktiv:horn, veikko usw. wird "B" auch mit in die Userlist übernommen.

Jetzt meine Frage: Wie kann ich nach den werten st:A, st:B und st:P filtern, so dass diese nicht mit in die Userlist mitaufgenommen werden?!
Leider stehen die werte nich immer an letzter Stelle in der Datei.

Wie gesagt, bin ich noch awk / sed anfänger und bin gerade erst dabei das ganze zu lernen.

Wäre super wenn mir jemand helfen könnte.

Mfg
Rattlesnake

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: in awk nach Werten filtern

Beitrag von Meillo » 12.10.2009 10:46:03

Ich finde den Code nicht gerade sehr übersichtlich und bin sicher, dass es schöner gehen würde, aber darum geht's hier ja jetzt nicht. (Ich habe gerade auch keine Zeit eine bessere Implementierung zu entwickeln.) Immerhin schön, dass AWK verwendet wird. ::)

Ich denke du willst alle Zeilen die mit `st:' beginnen ignorieren. Dazu einfach beim ersten sed-Aufruf das

Code: Alles auswählen

-e '/^st:/d'
ergänzen. Das sollte reichen.

Also so:

Code: Alles auswählen

    USERLIST=`sed -e '/^st:/d' -e 's/.*://' $PROACC/$PRO.acc | ${AWK} -F\, '{ for (i = 1; i <= NF; i++) print $i}' | sort -u | ${AWK} '
#build array of existing accounts
BEGIN {
        cmd = "ypcat passwd | sed 's/:.*//'"
        while (( cmd | getline ) > 0) {
        accountlis[$0] = $0
        }
}
{
          if ( $1 in accountlist ){
                printf("%s,",$1)
          }
}
'`
Use ed once in a while!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: in awk nach Werten filtern

Beitrag von Duff » 12.10.2009 11:03:33

@Meillo: War ja relativ einfach zu lösen. Ich hatte versucht, das st beim substitude auszuschließen.
Oh, yeah!

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: in awk nach Werten filtern

Beitrag von Meillo » 12.10.2009 11:07:08

Duff hat geschrieben:@Meillo: War ja relativ einfach zu lösen. Ich hatte versucht, das st beim substitude auszuschließen.
Geht auch mit `-n' und einem `/^st:/!s///p'. (Ungetestet.)
Use ed once in a while!

Rattlesnake
Beiträge: 17
Registriert: 20.06.2007 09:24:12

Re: in awk nach Werten filtern

Beitrag von Rattlesnake » 12.10.2009 11:41:50

Wohoooo respekt ^^

so schnell hab ich nicht mit einer Antwort gerechnet ^^

Danke schonmal. Werds heute mal ausprobieren und dann berichten obs funktioniert bzw. so für uns ok ist :D



Mfg
Rattlesnake

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: in awk nach Werten filtern

Beitrag von Meillo » 12.10.2009 12:11:51

Rattlesnake hat geschrieben:Wohoooo respekt ^^

so schnell hab ich nicht mit einer Antwort gerechnet ^^
So ist das bei uns im Debianforum. ;-)
Use ed once in a while!

Rattlesnake
Beiträge: 17
Registriert: 20.06.2007 09:24:12

Re: in awk nach Werten filtern

Beitrag von Rattlesnake » 12.10.2009 12:38:37

Meillo hat geschrieben:
Rattlesnake hat geschrieben:Wohoooo respekt ^^

so schnell hab ich nicht mit einer Antwort gerechnet ^^
So ist das bei uns im Debianforum. ;-)
Hehe das weiß ich doch :D sonst würd ich doch hier nen nachfragen -.- xD

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: in awk nach Werten filtern

Beitrag von rendegast » 12.10.2009 19:12:47

Noch einen

Code: Alles auswählen

USERLIST=`cat $PROACC/$PRO.acc | egrep -v "^st:[ABP]$" | sed ....
Sollte USERLIST nicht allgemein auch gequotet werden?

Code: Alles auswählen

USERLIST="`cat $PROACC/$PRO.acc | egrep -v "^st:[ABP]$" | sed .... 
'`"
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Rattlesnake
Beiträge: 17
Registriert: 20.06.2007 09:24:12

Re: in awk nach Werten filtern

Beitrag von Rattlesnake » 13.10.2009 14:16:24

Noch ein kurzes Feedback :)

die Lösung von Meillo funktioniert einwandfrei ( wie nicht anders erwartet :P )

Danke nochmal für deine Hilfe :)


Mfg
Rattlesnake

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: in awk nach Werten filtern

Beitrag von Meillo » 13.10.2009 15:02:37

Rattlesnake hat geschrieben:Noch ein kurzes Feedback :)

die Lösung von Meillo funktioniert einwandfrei ( wie nicht anders erwartet :P )

Danke nochmal für deine Hilfe :)
Gern geschehn. :D
Use ed once in a while!

Antworten