Python

Mögen Sie Python mehr als Perl, soll auch diese Neigung nicht zu kurz kommen. Listing 6 ähnelt Listing 4, nutzt aber dabei ein paar Kniffe in Form von Modulen.

Listing 6

#!/usr/bin/python
import fileinput
import re
gesamt = 0
for zeile in fileinput.input():
  if re.match('\d+\t+.*\t+.*\t*\d+', zeile):
    spalten = re.split('\t+', zeile)
    gesamt += int(spalten[0]) * int(spalten[3])
print("Gesamt: %i km" % (gesamt))

Die Zeilen 2 und 3 deklarieren die Verwendung der Module fileinput [8] und re [9], die für eine vereinfachte Verarbeitung der Ein- und Ausgabe sorgen sowie das Verwenden regulärer Ausdrücke ermöglichen.

In Zeile 4 definieren Sie die Variable gesamt für die Gesamtsumme und initialisieren diese mit dem Wert null. Die For-Schleife in den Zeilen 5 bis 8 verarbeitet das Fahrtenbuch und iteriert zeilenweise durch den übergebenen Datenstrom.

Der liegt, bereitgestellt durch die Funktion fileinput.input(), als Liste vor. Der Inhalt der Liste kommt hierbei entweder via STDIN oder entstammt der Datei, die Sie dem Skript als Aufrufparameter mitgegeben haben.

Zeile 6 überprüft jede gelesene Zeile zuerst mithilfe eines regulären Ausdrucks daraufhin, ob sie eine bestimmte Struktur aufweist. In Betracht kommen nur solche Zeilen, die aus mindestens einer Ziffer bestehen, gefolgt von mindestens einem Tabulator, mehreren beliebigen Zeichen, mindestens einem Tabulator, noch einmal beliebigen Zeichen, mindestens einem Tabulator und mindestens einer Ziffer. Das überspringt die Kopfzeile des Fahrtenbuchs.

In Zeile 7 zerlegt das Skript die gelesene Zeile anhand des regulären Ausdrucks mit Tabulatoren in einzelne Spalten, die im weiteren Verlauf zum Berechnen der Distanz pro Tour dienen. Zeile 8 addiert die Distanz pro Tour zur Gesamtdistanz, wobei eine explizite Typkonvertierung des gelesenen Spalteninhalts via int() erfolgt.

Zu guter Letzt sorgt Zeile 9 für die Ausgabe der Gesamtdistanz. Um das Skript aufzurufen, bestehen die gleichen Möglichkeiten wie für die bereits oben gezeigte Perl-Variante (Listing 7).

Listing 7

$ python distanz.py fahrtenbuch.txt
Gesamt: 1740 km
$ ./distanz.py fahrtenbuch.txt
Gesamt: 1740 km
$ cat fahrtenbuch.txt | python distanz.py
Gesamt: 1740 km
$ cat fahrtenbuch.txt | ./distanz.py
Gesamt: 1740 km

Tcl

Die Tool Command Language Tcl mag vielleicht eher den älteren Semestern unter den Lesern vertraut sein, hat aber auch heute nichts von ihrer Fähigkeit verloren, auf clevere Weise Textdaten zu verarbeiten. Das entsprechende Skript finden Sie in Listing 8. Es greift ebenfalls wieder auf das Lesen von STDIN und auf reguläre Ausdrücke zurück.

Listing 8

set gesamtdistanz 0
while {1} {
  set zeile [gets stdin]
  if {[eof stdin]} {
    close stdin
    break
  }
  set felder [regexp -all -inline \[^\t\]+ $zeile]
  if {[string is integer -strict [lindex $felder 0]]} {
    incr gesamtdistanz [expr [lindex $felder 0] * [lindex $felder 3]]
  }
}
puts "Gesamt: $gesamtdistanz km"

Nach der Definition und Initialisierung der Variable gesamtdistanz mit null (Zeile 1) folgt eine While-Schleife (Zeile 2 bis 12). Diese liest solange von STDIN (Zeile 3), wie Daten anliegen. Bei dem Auftreten eines Dateiendes ("End of File", EOF) bricht die Schleife ab (Zeile 4 bis 7).

Das Skript trennt dann in Zeile 8 zunächst die gelesene Zeile in einzelne Spalten auf. Das erfolgt mithilfe eines regulären Ausdrucks anhand der Tabulatoren, die mehrfach vorkommen dürfen. Die Variable felder umfasst dann eine Liste, wobei jedes Listenelement eine Spalte des Fahrtenbuchs repräsentiert.

In Zeile 9 erfolgt eine Prüfung, ob die Zeichenkette in Feld 0 einer Integer-Zahl entspricht. Falls ja, handelt es sich nicht um die Kopfzeile. Dann multipliziert der Ausdruck aus Zeile 10 die Felder 0 und 3 miteinander und addiert das Ergebnis zur Gesamtsumme. Das incr()-Statement akzeptiert dazu einen zweiten Parameter mit der Zwischensumme.

Nach dem Durchlaufen aller Zeilen erfolgt in Zeile 14 die Ausgabe der Gesamtdistanz. Das Tcl-Skript erwartet das Fahrtenbuch über STDIN, sodass Sie den Aufruf aus Listing 9 zum Ausführen der Auswertung verwenden.

Listing 9

$ cat fahrtenbuch.txt | /usr/bin/tclsh distanz.tcl
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...