shell strings uniq machen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Voyager_MP
Beiträge: 628
Registriert: 22.06.2004 10:04:07
Wohnort: Aachen

shell strings uniq machen

Beitrag von Voyager_MP » 11.09.2008 11:52:18

ich habe so einen strings und muß alle doppelten rauswerfen.
2.8 2.8 2.8 2.8 2.8 2.8 2.8 2.8 2.8 2.8 2.8 2.8 2.8 2.8 2.8 2.9

so soll es dann aussehen
2.8 2.9

leider habe ich nur, was die busybox hergibt. (sed, cut, grep, sort (ohne -u ;())

Vielen dank
Gruß Michel

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: shell strings uniq machen

Beitrag von gms » 11.09.2008 12:50:39

eine shell script variante von "uniq":

Code: Alles auswählen

gms2 ~ # cat uniq.sh
#!/bin/sh

uniq() {
 local X=()
 local i=-1
 local word
 for word in "$@"; do
   if [[ " ${X[@]} " != *" ${word} "* ]]; then
     i=$((i+1))
     X[$i]="${word}"
   fi
 done
 echo "${X[@]}"
}

uniq "$@"
gms2 ~ # ./uniq.sh 2.8 2.8 2.8 2.8 2.8 2.8 2.8 2.8 2.8 2.8 2.8 2.8 2.8 2.8 2.8 2.9
2.8 2.9
Gruß
gms

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

Re: shell strings uniq machen

Beitrag von Meillo » 11.09.2008 13:48:45

Voyager_MP hat geschrieben:sort (ohne -u ;()
Die busybox hat doch ein `uniq'!


... `sort -u' should really be considered harmful (like `cat -v').
People don't even know about `uniq'!
Use ed once in a while!

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

Re: shell strings uniq machen

Beitrag von Duff » 11.09.2008 15:45:48

Sehr interessant gms. Aber wofür benötigt man die * in der if-Abfrage?
(kenne ich so gar nicht)
Oh, yeah!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: shell strings uniq machen

Beitrag von gms » 11.09.2008 17:17:48

Duff hat geschrieben:Sehr interessant gms. Aber wofür benötigt man die * in der if-Abfrage?
nehmen wir mal an, daß im Array "X" die Werte "2.8" und "2.9" schon eingetragen wurden und in der Variable "word" auch "2.8" steht und wir wollen Abfragen, ob der Inhalt von "word" schon im Array "X" enthalten ist.
dann würde die expandierte Zeile so ausschauen

Code: Alles auswählen

if [[ " 2.8 2.9 " != *" 2.8 "* ]]; then
die "*" Zeichen stehen hier für "beliebiger Inhalt", daher wäre *" 2.8 "* auch gleich " 2.8 2.9 ", die if-Bedinung wäre daher nicht erfüllt und der Inhalt von "word" würde auch nicht in das Array "X" eingefügt werden

Gruß
gms

edit: die Doku zu "*" findest du in "man bash" unter "Pattern Matching" und unter "Compund Commands" wird die "[[ expression ]]" Expression genauer beschrieben. Wichtig ist hier, daß der Pattern immer auf der rechten Seite der Abfrage stehen muß:
man bash hat geschrieben: When the == and != operators are used, the string to the right
of the operator is considered a pattern and matched according to
the rules described below under Pattern Matching.

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

Re: shell strings uniq machen

Beitrag von Duff » 12.09.2008 08:14:11

@gms: OK, danke für die ausführliche Erklärung. Nun habe ich es verstanden, denke ich.
Oh, yeah!

Antworten