script - freie kürzel

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Colttt
Beiträge: 3012
Registriert: 16.10.2008 23:25:34
Wohnort: Brandenburg
Kontaktdaten:

script - freie kürzel

Beitrag von Colttt » 19.12.2011 11:43:53

Hallo,

ich habe foglendes Problem, wir haben hier 2stellige benutzerkürzel (nur Großbuchstaben) ich würde gerne wissen welche schon vergeben sind und vor allem welche noch frei sind.
soo sieht eine datei aus:

Code: Alles auswählen

TERMID=MO               export TERMID
TERMID=SZ               export TERMID
                1)      STANDORT=MC; PRTGRP=LB; TERMID=N2; MENUE=main;
                2)      STANDORT=MC; PRTGRP=BR; TERMID=NA; MENUE=main; break
wie bekomme ich nur die beiden buchstaben heraus die hinter TERMID stehen? Wenn da immer nur Termid stehen würde wäre es ja einfach, nur leider ist dem nicht immer so..

und dann zu schwierigeren frage, wie bekomme ich heraus welche noch frei sind?

Vielen Dank im Voraus!
Debian-Nutzer :D

ZABBIX Certified Specialist

uname
Beiträge: 12414
Registriert: 03.06.2008 09:33:02

Re: script - freie kürzel

Beitrag von uname » 19.12.2011 12:46:13

Vieleicht so rausbekommen:

Code: Alles auswählen

cat test.txt |egrep "^TERMID" |cut -c8-9 |sort |uniq
Lese Datei, suche nur Zeilen die mit TERMID beginnen, wähle nur die Zeichen 8 und 9, sortiere, zeige jedes nur einmal an.

uname
Beiträge: 12414
Registriert: 03.06.2008 09:33:02

Re: script - freie kürzel

Beitrag von uname » 19.12.2011 12:49:25

Um schnell rauszubekommen welche noch frei sind. Ich gehe von Großbuchstaben aus.

Erstelle eine aazz.txt-Datei:

Code: Alles auswählen

for i in {A..Z};do for j in {A..Z}; do echo $i$j;done;done > aazz.txt
Leite auch das Ergebnis von oben um:

Code: Alles auswählen

cat test.txt |egrep "^TERMID" |cut -c8-9 |sort |uniq > benutzer.txt
Nun ein diff:

Code: Alles auswählen

diff benutzer.txt aazz.txt
PS.: Nicht probiert. Das "> " kannst du natürlich wieder rausfiltern z.B. mit "cut -c3-4".

uname
Beiträge: 12414
Registriert: 03.06.2008 09:33:02

Re: script - freie kürzel

Beitrag von uname » 19.12.2011 12:59:00

Nachtrag:
Falls Du TERMID nicht nur zu Beginn einer Zeile hast (1.) und 2.) in deinem Beispiel) und diese Infomationen auch benötigst könntest du vorher alles incl. "TERMID=" rauswerfen:

Code: Alles auswählen

sed 's/^.*TERMID\=//g' test.txt > test2.txt
Das "egrep" brauchst du dann nicht mehr und nur noch ein "cut -c1-2".

Nun die große Frage. Wer fasst alles zu einem schönen awk-Script zusammen?

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: script - freie kürzel

Beitrag von Cae » 19.12.2011 13:10:14

So ungefähr:

Code: Alles auswählen

#!/bin/sh
cat file0 file1 | sed 's/.*TERMID=(..).*/$1' > ids

for char0 in $(seq 0 9); do
    for char1 in $(seq 0 9); do
        echo "$char0$char1" >> all-ids
    done
done

comm -3 ids all-ids > clear-ids
Mir ist klar, dass es so unbrauchbar ist. Die Idee dahinter ist, ein Wörterbuch zu bauen, per RegEx die IDs rausfiltern und mit comm die gleichlautenden Teile entfernen und alles in die Ergebnisdatei zu packen.
Oben fehlt dazu noch eine Prüfung der RegEx, die Buchstaben im Wörterbuch, evtl. mit seq 0 36 und tr '[10-36]' '[A-Z]' (geht das überhaupt?). Das Wörterbuch muss nur ein Mal erstellt werden.

Gruß Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

yeti

Re: script - freie kürzel

Beitrag von yeti » 19.12.2011 15:17:03

Colttt hat geschrieben:wie bekomme ich nur die beiden buchstaben heraus die hinter TERMID stehen?

Code: Alles auswählen

$ cat datei 
TERMID=MO               export TERMID
TERMID=SZ               export TERMID
                1)      STANDORT=MC; PRTGRP=LB; TERMID=N2; MENUE=main;
                2)      STANDORT=MC; PRTGRP=BR; TERMID=NA; MENUE=main; break
$ awk < datei 'match($0,"TERMID=..") { print substr($0,RSTART+7,2) }'
MO
SZ
N2
NA
Colttt hat geschrieben:und dann zu schwierigeren frage, wie bekomme ich heraus welche noch frei sind?
Ich sehe da ein N2... es sind also nicht nur 2 Großbuchstaben?
Sind Ziffern also erlaubt?
Auch an erster Stelle?

Code: Alles auswählen

awk < datei 'match($0,"TERMID=..") { S[substr($0,RSTART+7,2)]++ } END { D="ABCDEFGHIJKLMNOPQRSTUNWXYZ0123456789" ; for( j=0 ; j<=26+10 ; j++ ) for( i=0 ; i<=26+10 ; i++ ) { x=substr(D,j,1)substr(D,i,1) ; if( !S[x] ) print x } }'
Dies gibt zeilenweise alle Pärchen (Großbuchstaben und Ziffern an beiden Stellen erlaubt) aus die nicht benutzt wurden.

Willst Du Ziffern in einer Stelle nicht erlaubem, mops der der Stelle zugehörigen Schleife das "+10" im Vergleichsdausdruck.

Colttt
Beiträge: 3012
Registriert: 16.10.2008 23:25:34
Wohnort: Brandenburg
Kontaktdaten:

Re: script - freie kürzel

Beitrag von Colttt » 19.12.2011 15:24:27

es sind nur Großbuchstaben erlaubt, mehr meines wissens nicht..

Aber vielen dank.. es geht.. :D
Debian-Nutzer :D

ZABBIX Certified Specialist

yeti

Re: script - freie kürzel

Beitrag von yeti » 19.12.2011 15:53:45

Colttt hat geschrieben:es sind nur Großbuchstaben erlaubt, mehr meines wissens nicht..
Lies Dir meinen obig geposteten Kram nochmal ganz in Ruhe durch und dann schau Dir deinen eigenen Beispieldateinschnipsel nochmal ganz in Ruhe an...

Colttt
Beiträge: 3012
Registriert: 16.10.2008 23:25:34
Wohnort: Brandenburg
Kontaktdaten:

Re: script - freie kürzel

Beitrag von Colttt » 19.12.2011 16:12:28

ja ok danke..
nur scheint das skript leider nicht auf Unixbzw Solaris zu laufen.. (ja ich weiss ich hab das nicht zusätzlich gesagt, sorry)
Debian-Nutzer :D

ZABBIX Certified Specialist

yeti

Re: script - freie kürzel

Beitrag von yeti » 19.12.2011 16:42:20

Colttt hat geschrieben:ja ok danke..
nur scheint das skript leider nicht auf Unixbzw Solaris zu laufen.. (ja ich weiss ich hab das nicht zusätzlich gesagt, sorry)
Ich bin mir nicht bewußt irgendwelche schwarze Magie benutzt zu haben... aber selbst wenn... forsch mal genauer nach... 99% der Arbeit ist Dir ja nun schon abgenommen worden, das fehlende % wird Dich doch wohl nicht etwa überfordern‽

----------
Edit: --typos
Zuletzt geändert von yeti am 19.12.2011 21:56:18, insgesamt 1-mal geändert.

uname
Beiträge: 12414
Registriert: 03.06.2008 09:33:02

Re: script - freie kürzel

Beitrag von uname » 19.12.2011 16:57:38

Vielleicht kannst du jemanden wie mir als awk-Einsteiger noch erklären wo du das "RSTART" ausgegraben hast. Google findet nicht viel in Verbindung mit AWK. Muss wohl irgendwie mit "match" zusammenhängen.

Ok habe es doch noch gefunden. Eine Suche nach

Code: Alles auswählen

awk +"RSTART" 
wirkt manchmal Wunder. Man soll nicht Google selbst denken lassen.

http://www.gnu.org/s/gawk/manual/gawk.html
7.5.2 Built-in Variables That Convey Information

Benutzeravatar
SubOptimal
Beiträge: 1709
Registriert: 10.01.2005 23:25:46
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: bei Frankfurt

Re: script - freie kürzel

Beitrag von SubOptimal » 19.12.2011 17:17:54

Hi,
uname hat geschrieben:Vielleicht kannst du jemanden wie mir als awk-Einsteiger noch erklären wo du das "RSTART" ausgegraben hast.
...
Ok habe es doch noch gefunden. Eine Suche nach

Code: Alles auswählen

awk +"RSTART" 
wirkt manchmal Wunder. Man soll nicht Google selbst denken lassen.
Warum immer Google bemühen? Du hast doch die Antwort (sehr wahrscheinlich) schon auf dem Rechner

Code: Alles auswählen

man awk
# liefert u.a. folgende Informationen
...
RSTART    index set by the last call to match().
...
match(s,r)
     Returns  the  index of the first longest match of regular expression r in string s
...
SubOptimal

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

Re: script - freie kürzel

Beitrag von Meillo » 20.12.2011 20:56:20

SubOptimal hat geschrieben: Warum immer Google bemühen? Du hast doch die Antwort (sehr wahrscheinlich) schon auf dem Rechner

Code: Alles auswählen

man awk 
FULL ACK.
Use ed once in a while!

Antworten