Aus Raspberry Pi Geek 03/2016

Alltagsaufgaben mit Bordmitteln lösen

© Suwit Luangpipatsorn, 123RF

Sieben Brücken

Frank Hofmann

Computer wurden ursprünglich als Rechenmaschinen entwickelt. Am Beispiel eines Fahrtenbuchs zeigen wir, wie Sie mit Bordmitteln das Maschinchen zu Ihren Gunsten werkeln lassen. Dabei stellen wir Ihnen sieben Varianten der Problemlösung vor.

Wer viel unterwegs ist, führt meist ein Fahrtenbuch, in dem er jede einzelne Tour vermerkt – sei es aus persönlichem Interesse, für die Steuererklärung oder für den Arbeitgeber. In vielen Fällen genügt am Ende lediglich die Angabe der Gesamtkilometerzahl. Doch wie errechnet man das am geschicktesten, also ohne viel Aufwand?

Dafür ein gesondertes Programm zu erwerben oder zu installieren erscheint zu viel des Guten. Die nachfolgend vorgestellten Lösungen demonstrieren, wie Sie das Problem(chen) mit Werkzeugen lösen, die meist sowieso auf dem Raspberry Pi installiert sind, auch wenn Sie das vielleicht noch nicht unbedingt bewusst wahrgenommen haben.

Der Fokus der Lösungen liegt dabei auf Kompaktheit, Standardkonformität (also die Nutzung stets verfügbarer Standardmodule) und Verständlichkeit. Dabei haben wir die einzelnen Varianten nicht auf das letzte Bit optimiert, aber so zusammengestellt, dass Sie auch nach längerer Zeit noch verstehen, was vor sich geht.

In die hier umgesetzten Varianten fließen Ideen mit ein, die Teilnehmer der vom Autor durchgeführten LPIC-1/Unix/Linux-Kurse [1] fabriziert haben. Dabei handelt es sich zum Teil um sehr kompakte, durchdachte Lösungen – Vielfalt als Anregung sozusagen. Alle Lösungen funktionieren und liefern das korrekte Ergebnis, bedürfen aber unterschiedlich langer Erklärungen und (Vor-)Wissen, um den mitunter recht kryptisch wirkenden Programmcode zu verstehen.

Das hier gezeigte Beispiel und die Lösungen lassen sich auch gut auf andere Themen übertragen, etwa auf Rechnungen (Kassenzettel beziehungsweise den Warenkorb eines Internetshops) oder Download-Statistiken (Häufigkeit des Zugriffs für bereitgestellte Inhalte einer Webseite).

Ausgangsbasis Text

Den Ausgangspunkt für die Berechnungen bildet eine schlichte Textdatei, die über fünf Spalten verfügt: die Häufigkeit der Strecke (Anzahl), den Startpunkt (Von), das Fahrtziel (Nach), die Einzeldistanz (Distanz) und den Grund für die Fahrt. Die erste Zeile beinhaltet eine Kopfzeile, danach folgen zeilenweise die Daten für die gefahrene Strecke.

Die Textdatei heißt hier schlicht und einfach fahrtenbuch.txt. Damit das Fahrtenbuch hübsch aussieht, wenn Sie es ausdrucken, erlaubt das verwendete Format eine variable Anzahl von Tabulatoren zwischen den Spalten. Auf diese Weise erscheinen bei Anzeige und Druck alle erfassten Inhalte ordentlich neben- und untereinander (Abbildung 1).

Abbildung 1: Eine variable Anzahl von Tabulatoren sorgt bei Anzeige und Ausdruck für ein manierliches Erscheinungsbild des Fahrtenbuchs.

Abbildung 1: Eine variable Anzahl von Tabulatoren sorgt bei Anzeige und Ausdruck für ein manierliches Erscheinungsbild des Fahrtenbuchs.

Shell

Der erste Gedanke führt zu einem beherzten Griff in den Werkzeugkasten Ihres Raspbian-Systems. Listing 1 flanscht daraus die Werkzeuge Cat, Tail, Awk, Tr, Sed und Bc aneinander. Jedes davon wirkt als Filter für den übergebenen Datenstrom und verändert diesen, jedoch nicht die Originaldatei.

Cat liest die Datei mit dem Fahrtenbuch und gibt deren Inhalt auf STDOUT aus. Über eine Pipe (|) leiten Sie die Ausgabe an Tr weiter. Dieses ersetzt im Datenstrom alle mehrfach vorkommenden Tabulatoren (-s '\t') durch einen Doppelpunkt – ein Trennzeichen, das im Fahrtenbuch ansonsten nicht vorkommt.

Danach übergibt eine weitere Pipe den so modifizierten Datenstrom an Tail. Mit dem Schalter --lines=+2 sorgen Sie dafür, dass Tail erst ab der zweiten Zeile zu lesen beginnt und damit die für die Berechnung der Gesamtdistanz überflüssige Kopfzeile entsorgt.

Der verkürzte Datenstrom fließt wiederum über eine Pipe weiter an Awk [2], das sich jetzt auf die einzelnen Spalten stürzt. Mit dem Schalter -F : interpretiert es den Doppelpunkt als Trennzeichen zwischen den einzelnen Spalten. Über den Ausdruck '{print $1 * $4}' entnimmt Awk jeder Zeile die erste und die vierte Spalte, multipliziert die dort enthaltenen Werte und gibt das errechnete Produkt wieder auf STDOUT aus.

Jetzt liegen alle Zwischenergebnisse für die einzelnen Touren vor – jedes auf einer einzigen Zeile, die mit einem Zeilenumbruch (\n) abschließt. Um die Werte zu addieren, wollen wir am Ende Bc nutzen. Dieses Tool muss aber noch wissen, was es mit den Einzelwerten machen soll – es benötigt also jeweils einen Operator zwischen den Einzelwerten.

Mithilfe von Tr ersetzen Sie daher nun im Datenstrom alle vorkommenden Zeilenumbrüche (\n) durch ein schlichtes Plus (+). Auf diese Weise erhalten wir eine einzige Zeile mit einem mathematischen Ausdruck, den Bc später verarbeiten kann.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 5 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben