Awk

Das Verketten der vielen Einzelbefehle verursacht einige Tipparbeit. Die lässt sich jedoch reduzieren, indem man Awk sozusagen pur benutzt. Dazu definieren Sie wie in Listing 2 gezeigt drei Blöcke mit Anweisungen, jeweils eingerahmt von geschweiften Klammern.

Listing 2

BEGIN { FS="\t+" }
{ gesamt += $1 * $4 }
END {printf "Gesamt: %d km\n", gesamt}

Im ersten Block legen Sie nach dem Schlüsselwort BEGIN das zu verwendende Trennzeichen fest. Dazu setzen Sie die Awk-Variable FS ("file separator") auf \t+, also eine Zeichenfolge aus einem oder mehreren Tabulatoren.

Im zweiten Block definieren Sie eine Variable gesamt, wobei Sie Awk anweisen, aus jeder gelesenen Zeile die erste und vierte Spalte zu entnehmen und deren Werte miteinander zu multiplizieren. Den ermittelten Einzelwert addieren Sie über den Operator += zur Variablen hinzu. Beinhaltet eine gelesene Spalte einen Text, ergibt dessen Umwandlung zur Zahl den Wert null. Daher bedarf es hier keiner gesonderten Behandlung der Kopfzeile.

Vor dem dritten Block steht das Schlüsselwort END und markiert das Ende der Aktionen pro gelesener Zeile. Anschließend erfolgt die Ausgabe mithilfe der Funktion printf(). Die Zeichenkette %d steht für "digit", also einen Zahlenwert. Awk ersetzt sie im Aufruf durch den errechneten Zahlenwert von gesamt.

Am besten speichern Sie das Awk-Skript als Datei distanz.awk, sodass es sich wiederholt benutzen lässt. Dann starten Sie die Berechnung mit dem Aufruf aus Listing 3. Dabei weist der Schalter -f Awk an, zur Verarbeitung das Skript aus der angegebenen Datei zu entnehmen. Der Aufruf geht davon aus, dass sich Daten und Awk-Skript im aktuellen Verzeichnis befinden. Liegen sie an anderen Stellen des Dateisystems, müssen Sie die entsprechenden Pfade mit angeben.

Listing 3

$ awk -f distanz.awk fahrtenbuch.txt
Gesamt: 1740 km

Perl

Auch mithilfe diverser verbreiteter Skriptsprachen lässt sich die Gesamtdistanz recht unkompliziert errechnen. Wir demonstrieren das im Folgenden für die drei Vertreter Perl [5], Python [6] und Tcl [7].

Das Perl-Skript aus Listing 4 überprüft in Zeile 2 zuerst, ob Sie beim Aufruf Parameter angegeben haben – falls nicht, bricht es kommentarlos ab. Zeile 3 definiert die Variable gesamt für die Gesamtsumme und initialisiert sie mit dem Wert null.

Listing 4

#!/usr/bin/perl
exit unless @ARGV;
my $gesamt = 0;
while(<>) {
 my @felder = split(/\t+/);
 $gesamt += $felder[0] * $felder[3];
}
print "Gesamt: $gesamt km\n"

Die While-Schleife in den Zeilen 4 bis 7 verarbeitet den Eingabestrom, der entweder aus einer angegebenen Datei oder aus dem Kanal STDIN kommen darf. Jede empfangene Zeile zerlegt das Skript mittels split() anhand der Tabulatoren in einzelne Spalten und speichert diese in der Liste @felder (Zeile 5). Dazu nutzt split() den bereits bekannten regulären Ausdruck \t+, der wieder eine Zeichenfolge aus mindestens einem Tabulator repräsentiert.

Die Distanz pro Fahrt errechnet sich dann aus dem Inhalt des ersten und vierten Feldes (Zeile 6). Beachten Sie hier, dass die Zählung der Indizes für die Felder mit null beginnt – bei den obigen Lösungen begann sie mit eins. Zeile 6 addiert die Distanz pro Fahrt zur bestehenden Gesamtdistanz hinzu, Zeile 8 gibt dann die gefahrene Gesamtstrecke aus.

Für den Aufruf des Skripts ergeben sich die vier Möglichkeiten aus Listing 5, sodass Sie das Skript flexibel in einen weiteren Ablauf integrieren können. Lassen Sie jedoch im Skript die Zeile 3 weg, die auf Eingabeparameter prüft, entfallen die beiden Aufrufvarianten via Cat. Entscheiden Sie selbst, was Sie benötigen.

Listing 5

$ ./distanz.pl fahrtenbuch.txt
Gesamt: 1740 km
$ perl distanz.pl fahrtenbuch.txt
Gesamt: 1740 km
$ cat fahrtenbuch.txt | perl distanz.pl
Gesamt: 1740 km
$ cat fahrtenbuch.txt | ./distanz.pl
Gesamt: 1740 km

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 5 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Durchgeschlängelt
    Mit Features überladene Tabellenkalkulationen gibt es zur Genüge. Dass eine ausgefeilte Spreadsheat-Anwendung auch einsteigertauglich sein kann, demonstriert das auf Python basierende Pyspread.
  • Am Fließband
    Mit Sed editieren Sie Textdaten ohne interaktive Benutzeroberfläche – auch in Pipes oder der Eingabeumlenkung. In einer einzigen Zeile lassen sich umfangreiche Editierkommandos absetzen.
  • Stream-Editor sed
    Für stets wiederkehrende Aufgaben an einer oder mehreren Dateien kann das Arbeiten mit einem reinen Text-Editor schnell mühsam werden. Mit "sed" sparen Sie jede Menge Tipparbeit.
  • Besser finden
    Das kleine Werkzeug Agrep erweitert die Möglichkeiten beim Durchstöbern von Texten um die unscharfe Suche.
  • Bash-Skripte sind Programme
    Wer regelmäßig mit der Shell arbeitet, wird leicht zum Programmierer: Schreiben Sie mehrere Shell-Befehle in eine Textdatei und machen diese ausführbar, haben Sie schon Ihr erstes Shell-Skript entwickelt. Die Shell bietet als Programmiersprache aber noch viel mehr.
Kommentare

Infos zur Publikation

LU 12/2017: Perfekte Videos

Digitale Ausgabe: Preis € 5,95
(inkl. 19% MwSt.)

LinuxUser erscheint monatlich und kostet 5,95 Euro (mit DVD 8,50 Euro). Weitere Infos zum Heft finden Sie auf der Homepage.

Das Jahresabo kostet ab 86,70 Euro. Details dazu finden Sie im Computec-Shop. Im Probeabo erhalten Sie zudem drei Ausgaben zum reduzierten Preis.

Bei Google Play finden Sie digitale Ausgaben für Tablet & Smartphone.

HINWEIS ZU PAYPAL: Die Zahlung ist ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!

Stellenmarkt

Aktuelle Fragen

Broadcom Adapter 802.11n nachinstallieren
Thomas Mengel, 31.10.2017 20:06, 2 Antworten
Hallo, kann man nachträglich auf einer Liveversion, MX Linux auf einem USB-Stick, nachträglich...
RUN fsck Manually / Stromausfall
Arno Krug, 29.10.2017 12:51, 1 Antworten
Hallo, nach Absturz des Rechners aufgrund fehlendem Stroms startet Linux nicht mehr wie gewohn...
source.list öffnet sich nicht
sebastian reimann, 27.10.2017 09:32, 2 Antworten
hallo Zusammen Ich habe das problem Das ich meine source.list nicht öffnen kann weiß vlt jemman...
Lieber Linux oder Windows- Betriebssystem?
Sina Kaul, 13.10.2017 16:17, 6 Antworten
Hallo, bis jetzt hatte ich immer nur mit
IT-Kurse
Alice Trader, 26.09.2017 11:35, 2 Antworten
Hallo liebe Community, ich brauche Hilfe und bin sehr verzweifelt. Ih bin noch sehr neu in eure...