Login
Login-Name Passwort


 
Newsletter
Werbung

Do, 7. Dezember 2017, 15:00

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
Es gehört zwar nicht direkt zu Thema, aber vielleicht fragt sich manch einer, wie man eine normale Textdatei in Worte so aufsplittet, dass sich in jeder Zeile des Ergebnisses genau ein Wort befindet. Hier hilft das Tool 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

Pro-Linux
Traut euch!
Neue Nachrichten
Werbung