Sonntag, 1. Januar 2017

Mit Linux-Bordmitteln Fahrstrecken ausrechnen

Unterwegs zwischen Neuenburg und Genf
Wer viel zwischen unterschiedlichen Orten unterwegs ist, kennt das Bedürfnis: irgendwann will man wissen, wieviele Kilometer man tatsächlich zurückgelegt hat. Erfassen Sie das nicht automatisiert mit ihrem Smartphone -- bspw. mit Route Tracker --, helfen für das Ergebnis etwas Handarbeit und wenige Zeilen Programmcode.

Grundlage für die Berechnung ist eine Textdatei mit den fünf Spalten Anzahl, Von, Nach, Distanz und Grund. Erstere gibt an, wie häufig diese Strecke genutzt wurde, Von und Nach den Start- und Endpunkt der Reise, Distanz die Entfernung zwischen Start- und Endpunkt sowie Grund den Anlass der Reise. Alle Spalten sind mit Tabulatoren voneinander getrennt, damit die Spalten bei der Ausgabe auf dem Terminal oder im Texteditor auch hübsch untereinander angeordnet werden. Leerzeichen kommen nicht als Spaltentrenner in Frage, da Ortsangaben noch Erweiterungen wie Flußnamen oder Regionen haben können.

Ausschnitt aus den erfaßten Strecken für 2016 im Texteditor Vim
Für die Lösungsvariante tritt awk in den Ring und punktet mit einem Dreizeiler.

awk-Variante zur Berechnung der Gesamtkilometerzahl
In Zeile 1 wird der Inhalt der internen awk-Variable FS redefiniert. FS kürzt field separator ab und beinhaltet die Trennzeichen, die awk benutzt, um die einzelnen Spalten zu erkennen. Hier wird FS auf mehrfach aufeinanderfolgende Tabulatoren gesetzt.

In Zeile 2 werden der Inhalt der beiden Spalten 1 und 4 miteinander multipliziert und zur Variable gesamt addiert. awk merkt sich für jede gelesene Zeile den Spalteninhalt in den Variablen $1 bis $5. Die Spaltentrennung erfolgt anhand von FS wie zuvor in Zeile 1 festgelegt.

Nützlich sind hier mehrere Automatismen von awk:
  • die Variable gesamt wird automatisch angelegt und mit 0 initialisiert, sofern diese noch nicht existiert. 
  • Enthalten die Variablen $1 bis $5 keine Zahlenwerte, erfolgt keine Berechnung. Damit wird die erste Zeile elegant verabeitet und muss nicht zuvor von Hand entfernt werden.
  • Alles zwischen den beiden Schlüsselworten BEGIN und END wendet awk auf jede gelesene Zeile an. Eine explizite for-Schleife entfällt.
Abschließend erfolgt in Zeile 3 die Ausgabe der aufsummierten Gesamtkilometer mit Hilfe der awk-Funktion printf.

Für das Kalenderjahr 2016 sieht das Ergebnis wie folgt aus, wobei das awk-Skript aus der Datei distanz.awk kommt und das Fahrtenbuch in der Datei fahrtenbuch-2016.txt enthalten ist:

$ awk -f distanz.awk fahrtenbuch-2016.txt
Gesamt: 100245 km

$

Das sind zweieinhalbmal um die Erde. Welche Orte es 2016 waren, entnehmen Sie dieser Liste.

Weitere Lösungsvarianten für die Shell sowie mittels Python, Perl, Tcl und SQL inklusive einer ausführlichen Beschreibung entnehmen Sie meinem Artikel Sieben Brücken. Alltagsaufgaben mit Bordmitteln lösen aus LinuxUser 05/2016. Die Skripte finden Sie auch in meinem Repository auf GitHub.

Keine Kommentare:

Kommentar veröffentlichen