|
|
Computerlinguistik
Linux-Tools für Computerlinguisten
| |
Dateien anzeigen, Zeichen zählen
|
|
| |
Inhalt von einer oder mehreren Dateien ausgeben
cat eingabedatei1 eingabedatei2
|
|
| |
Inhalt
von einer Datei seitenweise ausgeben (Blättern mit <space>,
Ende mit q)
more eingabedatei
less eingabedatei
|
|
| |
Anzahl der Zeilen, Wörter und Zeichen
einer Datei ausgeben
wc eingabedatei
|
|
| |
Schleifen und Textfeedback
|
|
| |
Echo: Ausgabe von Textfeedback ins Terminalfenster.
Mit der Zusatzoption "-e" werden bestimmte Escape-Sequenzen wie z.B. \t bzw \n im Text als Tabulator bzw Zeilenumbruch interpretiert. Mit der Ausgabeumleitung > kann die Ausgabe von Echo auch in einer Datei gespeichert werden.
echo "Ein kleiner Text" > textdatei
echo -e "Worte \t mit \t Tabulatoren \t dazwischen"
|
|
| |
Schleife: Programme über eine Menge von Daten automatisiert ablaufen lassen.
z=1; while test $z -lt 10; do echo $z; z=$(expr $z + 1); done
- In diesem Beispiel wird die Zählvariable z vor dem Beginn der Schleife auf 1 gesetzt.
- Dann folgt der Kopf der While-Schleife mit ihrer Abbruchbedingung -- d.h. hier, nur solange z kleiner (lt=less than) 10 ist, soll die Schleife weitermachen.
- Zwischen den Worten do und done steht der Rumpf der Schleife. Der Rumpf enthält die durch Strichpunkt getrennte Liste von Kommandos, die wiederholt werden sollen. Hier nur ein Textfeedback-Kommando "echo $z". Wie man sieht, kann innerhalb des Rumpfes auf vorher definierte (Zähl-)Variablen zugegriffen werden, indem man ihrem Namen ein $ voranstellt.
- Als letztes Kommando im Rumpf der Schleife muss die Zählvariable einen Schritt weitergezählt werden! z=$(expr $z + 1).
|
|
| |
Ausgabe weiterverwenden oder als Datei speichern |
|
| |
Pipe: Mit dem Symbol
| kann die Ausgabe von einem Befehl als Eingabe an den nächsten
Befehl weitergegeben werden, die Kette kann beliebig lang sein, z.B.:
sort eingabedatei | less
|
|
| |
Ausgabeumleitung: Mit dem Symbol
> kann die Ausgabe beliebiger Befehle in eine Datei
gespeichert werden (evtl. schon vorhandene Datei desselben Namens wird dabei
überschrieben!). Verwendet man >>, wird eine evtl. schon vorhandene Datei
nicht überschrieben, sondern die Ausgabe wird an die vorh. Datei angehängt.
sort eingabedatei > sortierte_datei
sort eingabedatei >> sortierte_datei
|
|
| |
Eingabeumleitung:
Analog dazu gibt es übrigens auch das Symbol <,
das den Inhalt einer Datei als Eingabe an einen Befehl schickt:
sort < eingabedatei
|
|
| |
Tee: Mit Hilfe der verzweigten Ausgabeumleitung "tee"
kann die Ausgabe beliebiger Befehle sowohl in eine Datei
'zwischenergebnis' gespeichert als auch anschliessend (z.B. in einer Pipe) weiterverwendet werden:
grep "hallo" datei | tee zwischenergebnis | sort > sortiertes_ergebnis
|
|
| |
Einzelne Zeichen ersetzen
|
|
| |
In der Datei "eingabedatei"
jeden Buchstaben X durch Y ersetzen und das Ergebnis in der Datei
"ausgabedatei" speichern
tr X Y < eingabedatei > ausgabedatei
|
|
| |
... jeden Kleinbuchstaben zu Großbuchstaben
umwandeln ...
tr 'a-z' 'A-Z' < eingabedatei > ausgabedatei
|
|
| |
... alle Satzzeichen durch Punkte
ersetzen ...
tr '.,:;?!' '.' < eingabedatei > ausgabedatei
|
|
| |
... alle Zeichen, die NICHT Zahlen
oder Buchstaben sind, durch ein Leerzeichen ersetzen...
tr -c '[0-9a-zA-Z]' ' ' < eingabedatei > ausgabedatei
|
|
| |
... alle mehrmals aufeinanderfolgenden
Buchstaben durch nur einen ersetzen ...
tr -s 'a-zA-Z' < eingabedatei > ausgabedatei
|
|
| |
... alle Nicht-Buchstaben durch
einen Zeilenumbruch ("\012") ersetzen, mehrfach aufeinander
folgende Zeilenumbrüche durch nur einen Umbruch ersetzen
...
(so genannter "Tokenizer" - alle Wörter
der Eingabedatei stehen danach einzeln in Zeilen)
tr -sc '0-9a-zA-Z' '\012' < eingabedatei > ausgabedatei
|
|
| |
Sortieren
|
|
| |
Eingabedatei alphabetisch nach dem
ersten Buchstaben jeder Zeile sortieren und ausgeben (Groß-
und Kleinschreibung wird unterschieden)
sort datei
|
|
| |
Eingabedatei alphabetisch
nach dem ersten Buchstaben des 3. Wortes/der 3. Spalte jeder
Zeile sortieren und ausgeben (Durchnummerierung der Spalten beginnt
bei Null!)
sort +2 datei
|
|
| |
Eingabedatei alphabetisch
sortieren, Groß- und Kleinschreibung ignorieren
sort -f datei
|
|
| |
Eingabedatei umgekehrt
alphabetisch sortieren
sort -r datei
|
|
| |
Eingabedatei numerisch
sortieren
sort -n datei
|
|
| |
Eingabedatei alphabetisch
sortieren, mehrfach vorkommende Zeilen wegschmeissen
sort -u datei
|
|
| |
Eingabedatei alphabetisch
sortieren und mehrfach vorkommende Zeilen zählen
sort datei | uniq -c
|
|
| |
Zugriff auf Teile von Dateien
|
|
| |
Dateianfang: Die ersten 7 Zeilen der Datei
ausgeben
head -7 datei
|
|
| |
Dateiende: Die letzten 7 Zeilen der Datei ausgeben
tail +7 datei
|
|
| |
Dateirest: die Datei ab der 7. Zeile von oben ausgeben
tail -7 datei
|
|
| |
Spalten rauskopieren: Die 7. Spalte jeder Zeile einer Datei ausgeben.
Die "Spalten" sind durch genau ein beliebiges Zeichen
'x' getrennt. Als Trennzeichen x kann verwendet werden: \n (Zeilenumbruch),
\t (Tabulator), \\ (Backslash), \0 (Leerzeichen) u.a.
cut -f7 -d 'x' datei
|
|
| |
Spalten zusammenfügen:
Mehrere Dateien werden zu einer Tabelle zusammenge"klebt",
wobei jede Ursprungsdatei jeweils einer Spalte der Ausgabe entspricht.
Trennzeichen 'x': siehe "cut"
paste -d 'x' datei1 datei2 datei3
|
|
| |
Zeilen zusammenfügen:
Mehrere Dateien werden zu einer Tabelle zusammenge"klebt",
wobei jede Ursprungsdatei jeweils einer Zeile der Ausgabe entspricht.
Trennzeichen 'x': siehe "cut"
paste -d 'x' -s datei1 datei2 datei3
|
|
| |
Filter: Alle Zeilen einer Datei
ausgeben, in denen das Wort "hallo" vorkommt.
grep hallo datei
|
|
| |
Filter: Alle Zeilen einer Datei
ausgeben, in denen das Wort "hallo" NICHT vorkommt.
grep -v 'hallo' datei
|
|
| |
Filter: Alle Zeilen einer Datei ausgeben, in
denen das Wort "bla" vorkommt, und zwar egal ob groß oder
klein geschrieben.
grep -i 'bla' datei
|
|
Durch Kombination von Pipes und Regulären Ausdrücken
können mehrere dieser kleinen Linuxtools
zu beliebig erweiterbaren großen Tools zusammengebaut werden:
| |
Flexible Dateibearbeitungs-Tools
|
|
| |
Beispiel für eine mehrteilige Pipeline:
Alle Wörter in der Datei 'datei' tokenizen, alphabetisch
sortieren, Häufigkeit einzelner Wörter zählen,
und das Ergebnis in der Datei "ergebnis" speichern
tr -sc 'a-zA-Z' '\012' < datei | sort | uniq -c > ergebnis
|
|
| |
Beispiel für Stream-Editor "sed":
Alle Wörter in der Datei tokenizen, und danach alle Auftreten
von "hallo" durch "tschuess" ersetzen. (sed
kann noch viel mehr...)
tr -sc 'a-zA-Z' '\012' < datei | sed 's/hallo/tschuess/g'
|
|
| |
RegExps: Zeichenketten können durch Kombinationen von Regulären
Ausdrücken flexibel beschrieben werden:
|
Leerzeichen am Zeilenanfang
Leerzeichen am Zeilenende
Null oder mehrere beliebige Zeichen
Null oder mehrere x
Ein oder kein x
Ein oder mehrere x
Genau 7 x
Zwischen 7 und 12 x
Genau ein beliebiges Zeichen
Ein Zeichen aus dieser Menge
|
^
$
*
[x]*
[x]?
[x]+
[x]{7}
[x]{7,12}
.
A-Z a-z 0-9 [aeiou] usw....
|
|
|
| |
RegExps mit "grep":
Alle Zeilen ausgeben, an deren Anfang "bla" UND an
deren Ende nicht "blubb" steht.
cat datei | grep '^bla' | grep -v 'blubb$'
|
|
| |
RegExps mit "grep":
Alle Zeilen ausgeben, die aus nichts außer beliebig vielen
Großbuchstaben bestehen.
cat datei | grep '^[A-Z]*$'
|
|
| |
RegExps mit "grep":
Alle Zeilen ausgeben, die nicht mit einem (egal ob groß
oder klein geschriebenen) Vokal anfangen.
cat datei | grep -iv '^[aeiou]'
|
|
| |
N-gram-Liste eines Korpus' erstellen: Korpus tokenizen, Zwischenergebnis speichern, oberste Zeile weglassen, mit 'paste' das Zwischenergebnis und den um eine Zeile gekürzten Korpus in einer Datei zweispaltig nebeneinander legen -- jetzt stehen in jeder Zeile ein Wort und das darauffolgende nebeneinander (Bigram). Das gleiche geht auch mit Trigrammen (2. Beispiel) usw. ...
tr -sc "a-zA-Z/'" '\n' < corpus.txt | tee corpus.tmp
| tail +2 | paste corpus.tmp -
tr -sc "a-zA-Z/'" '\n' < english.txt | tee corpus1.tmp | tail +2
| tee corpus2.tmp | tail +2 | paste corpus1.tmp corpus2.tmp -
... |
|
| |
usw |
|
Quellen: "Einsteigerseminar Linux" von R. Göstenmeier;
"Unix tools for Corpora (Kenneth Ward Church) / 'Unix for poets'" von M. Crocker; Manualpages
|
|