Shellskripte mit Aha-Effekt: Bash-Arrays
Anwendungen für Hashes
Wofür sind die assoziativen Arrays (Hashes) eigentlich wirklich gut? Hashes sind nützlicher als Arrays, wenn man auf ein Element lieber mit einer expliziten Bezeichnung (einem Schlüssel) als mit einem bloßen numerischen Index zugreifen möchte. Eine Anwendung ist das Prüfen, ob Schlüssel(-Worte) beispielsweise in einer Datei vorhanden sind. In solche Fällen kommt es nur auf den Schlüssel und nicht auf den Wert an. Ein typisches Beispiel wäre das Erstellen einer Wortliste aus einer Datei. Hierbei kommt es nur auf die Worte an und nicht auf deren Auftretenshäufigkeit. das folgende Programm hat eine ähnliche Funktion wie das UNIX-Kommando uniq
. Es wird jedes Wort nur einmal gespeichert, egal wie häufig es vorkommt. Bei dem Beispielprogramm wird davon ausgegangen, dass in einer Datei jeweils nur ein Wort in jeder Zeile steht.
Die ganze Magie verbirgt sich in Zeile 5. Das gelesene Wort wird als Schüssel gespeichert, wobei der Wert beliebig sein darf. Ist der Schlüssel neu, bekommt der Hash ein weiteres Element, ist er dagegen schon vorhanden, wird der Hash nicht erweitert. Die Ausgabe (Zeilen 8 bis 11) kennen Sie ja schon aus anderen Programmen. Diesmal wurde nur eine Sortierung nachgeschaltet.
01: declare -A STAT 02: 03: # Worte einlesen 04: while read WORT; do 05: STAT[$WORT]=1 06: done < text 07: 08: # Kontrollausgabe 09: for I in ${!STAT[@]}; do 10: echo "$I" 11: done | sort
tr
. Das folgende Skript (eigentlich ein Einzeiler, der nur zur Erläuterung hier mehrzeilig geschrieben wird) erstellt aus einer beliebigen Textdatei eine Wortliste. In Zeile 1 werden mehrere aufeinander folgende Leerzeichen durch ein einziges ersetzt. Zeile 2 entfernt alle Satzzeichen und Zahlen (alles bis auf die Buchstaben), in Zeile 3 werden die Leerzeichen zu Newline-Zeichen. Schließlich wird noch sortiert und dann die Doubletten entfernt.01: cat $DATEI | tr -s ' ' ' ' | 02: tr -d ' '-'@' | 03: tr ' ' '\n' | 04: sort | uniq