Sie ist schlüpfrig, einfach, klein und genial. Keine Programmiersprache, ausgenommen Brainfuck, hat mich in so kurzer Zeit, so begeistern können. Die Möglichkeiten mit denen dieser kleine Zeilenprozessor aufwartet sind gigantisch. Das Arbeitsspektrum reicht von kleinen Dateiüberarbeitungen ala sed, verbesserten Unix-Befehlen wie cat und grep, über das Mergen von zwei CSV-Dateien hin zur kompletten Datenbank.
Ich bin so begeistert von der Sprache, dass ich in der Firma kurzerhand die nächsten beiden Projekte die mit Datamining und/oder Datenmergen zu tun haben, mit awk verwirklichen werde. Die Entwicklungszeit ist so gering, dass man bei awk sicherlich von RAD (Rapid Application Development) reden kann.
Da mein Weblog in letzter Zeit eher einer Linksammlung geglichen hat, und ich weiß, dass viele Programmierer meinen Blog lesen, oder zumindest technikbegeisterte sind (von Geeks möchte ich nicht reden), werde ich einige Beispiele in awk zeigen.
Zunächst braucht jeder der die Beispiele mitverfolgen will, awk. awk gibt es nun wirklich für jede Plattform. Obwohl es seine Wurzeln in den 80igern, also in Unix-Zeiten hat, gibt es awk auch für DOS/Windows. Alle anderen Betriebssysteme kommen meistens von Haus aus mit awk. Ich für meinen Teil benütze mawk 1.3.3. SuSE Linux hat AFAIK gawk, aber die sind mit meinen Beispielen weitestgehend kompatibel.
awk ist wie ich oben schon erwähnte ein Zeileninterpreter. D. h. Zeilen werden aus einer CSV-Datei eingelesen und in Felder zerlegt. Diese Felder können manipuliert und dann ausgegeben werden. Ein kleines awk-Programm, das cat nachahmt sieht folgendermaßen aus.
{
print $0
}
$0 steht für eine komplette Zeile der Eingabe (CSV-Datei oder reguläre Datei). Die geschweiften Klammern, darf man als eine Art Funktion sehen, die bei jeder Zeile aufgerufen wird.
Der Aufruf von awk-Programmen sieht vereinfacht folgendermaßen aus.
lemming@ibook:~ $ awk '{ print $0; }'
Der Programmcode ist in der Kommandozeile und Daten werden von STDIO gelesen.
lemming@ibook:~ $ ls -l | awk '{ print $0; }'
Die Daten können auch aus einer Datei gelesen werden.
lemming@ibook:~ $ awk '{ print $0; }' daten.csv
Man kann auch ein Programm in einer Datei speichern.
lemming@ibook:~ $ awk -f meincat.awk daten.csv
Interessant wird die ganze Sache, sobald man die Felder einer CSV-Eingabe manipuliert.
Für die weiteren Beispiele nehme ich folgende Tabulator getrennte Tabelle, einem Auszug aus meiner ehemaligen Musikseite lemvista.de.
| id | Interpret | Titel | Abrufe |
| 1 | The Cardigans | My Favorite Game | 2470 |
| 2 | Metallica | Die Die Die My Darling | 730 |
| 3 | Eric Clapton | Cocaine | 230 |
| 4 | Eminem | 8 Mile | 1571 |
Der Code in awk um nur den Titelnamen mit dem Interpreten vorangestellt anzuzeigen würde so aussehen:
{
print $2 " - " $3;
}
lemming@ibook:~ $ awk -v FS="\t" '{ print $2 " - " $3; }' songs.tsv
Interpret - Titel
The Cardigans - My Favorite Game
Metallica - Die Die Die My Darling
Eric Clapton - Cocaine
Eminem - 8 Mile
Zudem kann man die Bearbeitung eines Blocks (die {}-Klammern) an eine RegExp-Bedingung knüpfen. Das macht Sinn, wenn man mehrere Blogs verwenden. FS ist die Variable die den Field-Seperator, in unserem Fall Tabulator, angibt. Variablen können, wie oben gesehen, auch von der Kommandozeile aus verändert werden.
BEGIN { FS ="\t";
}
/Clapton/{
#Dieser Block wird nur ausgeführt,
#wenn Clapton in der Zeile vorkommt
$2 = "Slowhand"
}
/Eminem/{
#Dieser Block wird nur ausgeführt,
#wenn Eminem in der Zeile vorkommt
$2 = "Slim Shady"
}
{
print $2 " - " $3;
}
The Cardigans - My Favorite Game Metallica - Die Die Die My Darling Slowhand - Cocaine Slim Shady - 8 Mile
Zu den Blocks, die Zeilen abarbeiten, gibt es noch ein BEGIN- und einen END-Block, die, wie die Name schon verraten, am Anfang und am Ende eines Programms ausgeführt werden.
BEGIN{ print "Abrufe werden zusammen gezählt";
FS = "\t";
}
{
#Aufrufe zusammen zählen
if (i > 0) { #Die erste Zeile wird ignoriert.
abrufe = abrufe + $4;
}
i++;
}
END {
print i " Titel wurden " abrufe "x abgerufen.";
}
lemming@ibook:~ $ awk -f count_loads.awk songs.tsv Abrufe werden zusammen gezählt 5 Titel wurden 5001x abgerufen.
Im zweiten Teil meines kleines awk-Tutorials werde ich zwei CSV-Dateien miteinander mergen. Wenn Ihr Fragen zu awk habt, dann stellt sie einfach in den Kommentaren.

14 Kommentare
Ich hab zwar keine Frage, wollte aber ein motivierendes “Weiter so, mehr davon bitte.” aussprechen
Danke, da liefere ich doch gleich gerne mehr.
Ich freu mich auch immer über Berichte zu mir noch unbekannten Programmier-/Skriptsprachen
Wenn dir awk und sed gefallen, probier mal perl!
Nee also bitte kein Perl mehr. Perl habe ich schon hinter mir. Damit hatte ich meine ersten Gehversuche in der CGI-Programmierung. Geschadet hat’s nicht, aber sagen wir mal geprägt.
Wenn ich irgendwo eine Software als .deb oder über apt sehe, die in Perl geschrieben ist, dann mache ich einen großen Bogen drum.
Und deiner einer mag Perl?
Ich schließe mich “Usul” an. Bitte weiter. Kann auch noch ein paar Ticks ausführlicher sein.
Danke.
Mir ist klar, dass es eine ganze Menge gruseliger Altlasten im Netz gibt, die Perl beinhalten. Wenn es aussieht als wäre jemand mit dem Kopf auf die Tastatur gefallen, dann könnte es trotzdem gültiges Perl sein - aber das hängt auch stark von demjenigen ab der die Programme schreibt.
Es gibt hervorragende Perl-Module im CPAN und ich kenne viele erstklassiche Programmierer die modernen, sauberen, objektorientierten Code schreiben. Was Webprogrammierung betrifft, ist Perl immer noch eine hervorragende Wahl, auch wenn es mittlerweile sehr schöne Dinge in Ruby (Rails) oder in Python (Zope) gibt. Aktuell wäre hier im Perl-Bereich Catalyst zu nennen, das vergleichbar zu Rails ist.
In deinem eigenen Blog gab es mal zu einem Rätsel einige sehr kompakte Lösungen in Perl (von Besuchern), die durchaus ansehnlich waren. Klar, keine Sprache verwendet mehr Operatoren als Perl, skurillere Konstrukte findet man vieleicht noch bei Lisp-Programmen, aber Perl bietet halt dem Programmierer einen hohen Freiheitsgrad, der im positiven wie im negativen genutzt werden kann.
Gruß,
Ronnie
awk? 2005? Sorry, aber IMHO hat awk spätenstens seit Perl5 (und das war? 1994?) keine Existenzberechtigung mehr. Bevor ich von Perl gehört hatte, hab ich auch so einiges in awk realisiert, danach nie wieder…
In Perl hast du halt viel mehr Möglichkeiten. Wenn du willst, kannst du in Perl ja auch (fast) awk schreiben (sieh’ dir mal den Output von a2p, den awk-nach-perl-konverter an), aber du kannst auch mehr haben. Und das willst du auch, vor allem wenn du, wie du schreibst “DataMining” betreiben sollst.
Hi,
habe ein Problem mit dem “TAB”
Ich lese eine Zeile aus einer Datei ein, deren “Worte” durch “tabs” getrennt sind (also soetwas wie “csv”).
Warum klappt dann folgende Pipe nicht ?:
echo $string | awk -v FS=”\t” ‘{print $1″_”$2″}’
Ich bekomme irgendwelchen Müll ausgegeben.
Hallo Frank,
du hast hinter $2 ein ” zuviel.
Wenn das nicht hilft, dann zeig mal $string.
Ich arbeite seit einem Jahr mit gawk
aber ich würde gern ein interface zu meinem
Programme bilden (button, radio ….) und meine scripte automatisch auszuführen.
kann ich dass mit gtk-perl machen,
Vielen dank