AA_PO-23676_SuwitLuangpipatsorn-123RF.jpg

© Suwit Luangpipatsorn, 123RF

Alltagsaufgaben mit Bordmitteln lösen

Sieben Brücken

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 System 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.

Shell

Der erste Gedanke führt zu einem beherzten Griff in den Werkzeugkasten Ihres Linux-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.

Mit der vorherigen Operation haben wir allerdings auch den letzten Zeilenumbruch eliminiert. Das bügeln wir mithilfe des Stream-Editors Sed [3] wieder aus, da Bc sonst ein Operand zur Berechnung fehlt. Der reguläre Ausdruck [4] 's/+$/+0\n/' sucht nach einem Plus-Zeichen direkt vor einem Zeilenende und ersetzt diese beiden Zeichen durch ein +, gefolgt von einer Null und einem Zeilenumbruch.

Das verändert die Gesamtdistanz nicht und sorgt gleichzeitig für korrekten Ausdruck sowie einen Zeilenumbruch am Ende. Letzteren benötigt Bc als Zeilenabschluss, um die ganze Zeile aufzusummieren. Das Gesamtergebnis gibt es schlussendlich wieder auf STDOUT aus.

Listing 1

$ cat fahrtenbuch.txt \
> | tr -s '\t' ':' \
> | tail --lines=+2 \
> | awk -F : '{print $1 * $4}' \
> | tr '\n' '+' \
> | sed 's/+$/+0\n/' \
> | bc
1740

TIPP

In Listing 1 haben wir der Übersichtlichkeit halber auf der Konsole alle Einzelbefehle der Fahrtenbuch-Toolchain in einer eigenen Zeile eingegeben und jeweils durch [Eingabe] bestätigt. Dabei dient der Backslash (\) in jeder Zeile quasi als Fortsetzungszeichen und weist die Shell an, die folgende Eingabe als Teil der vorigen Zeile zu behandeln. Sie können stattdessen auch die Backslashes weglassen und alle Kommandos in einer einzigen Zeile angeben.

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

Installation Linux mint auf stick
Reiner Schulz, 10.12.2017 17:34, 0 Antworten
Hallo, ich hab ein ISO-image mit Linux Mint auf einem Stick untergebracht Jetzt kann ich auch...
Canon Maxify 2750 oder ähnlicher Drucker
Hannes Richert, 05.12.2017 20:14, 4 Antworten
Hallo, leider hat Canon mich weiterverwiesen, weil sie Linux nicht supporten.. deshalb hier die...
Ubuntu Server
Steffen Seidler, 05.12.2017 12:10, 1 Antworten
Hallo! Hat jemand eine gute Anleitung für mich, wie ich Ubuntu Server einrichte? Habe bisher...
Tinte sparen bei neuem Drucker
Lars Schmitt, 30.11.2017 17:43, 2 Antworten
Hi Leute, ich habe mir Anfang diesen Monats einen Tintenstrahldrucker angeschafft, der auch su...
Für Linux programmieren
Alexander Kramer, 25.11.2017 08:47, 3 Antworten
Ich habe einen Zufallsgenerator entworfen und bereits in c++ programmiert. Ich möchte den Zufalls...