Logo
RuTh's  RuThLEss  HomEpAgE

 

sTaRt
 
 
 
 
 
 
 
 
FuN
 
 
 
 
fAcTs
 
 
 
 
 
 
 
>
StudiumDeutsch
>
Linux-Tools für ColisDeutsch
>
CoLi Spiele/GamesEnglishDeutsch
>
CoLi Links
 

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

 
   
2008.08.26

http://www.ruthless.zathras.de/