Mit Miller strukturierte Textdateien verarbeiten

Immer schön der Reihe nach

Bei der Arbeit mit strukturierten Textdateien bietet Miller eine clevere Alternative zu herkömmlichen Werkzeugen wie Grep, Cut, Sed und anderen.

Ein Werkzeug für viele Aufgaben, auch mit strukturierten Dateien – dieses Versprechen versucht Miller (http://johnkerl.org) zu erfüllen. Anstelle langer, von Pipes gesäumten Anweisungen kommen Sie mit kompakteren Konstrukten zum Ziel. Für diesen Beitrag kam Version 3.1.2 zum Einsatz, frisch aus den Quellen kompiliert.

Das Kommandozeilentool Miller unterstützt eine Vielzahl von Formaten (siehe Tabelle "Datenstrukturen"), die es beim Aufruf mit mlr --usage-data-format-examples auflistet. Wollen Sie das Dateiformat für die Ein- und Ausgabe getrennt bestimmen, verwenden Sie ein vorangestelltes i für die Eingabe und ein o für die Ausgabe.

Datenstrukturen

Typ/Formatangabe Merkmale
dkvp Bezeichner mit Wertzuweisungen, Komma als Feldtrenner (Variable=Wert,)
nidx numerische Feldbezeichner, Komma als Feldtrenner (1=Wert1,)
csv keine Feldbezeichner, Text optional in Anführungszeichen, Komma als Feldtrenner (a,b,c)
pprint formatierte Ausgabe durch Miller, erzeugt Tabellen
xtab gibt Tabellen vertikal aus, je Zeile ein Feldbezeichner mit einem Wert

TIPP

Erscheint keine Ausgabe, fehlt Miller der Hinweis auf das Sonderzeichen "Zeilenvorschub", was besonders bei CSV-Dateien häufig auftritt. Geben Sie mlr --csv --rs lf am Anfang des Kommandos ein, sollte das Verarbeiten klappen.

Um die Teile eines Datensatzes voneinander abzugrenzen, kommt in der Regel ein Komma zum Einsatz. Darüber hinaus besteht die Möglichkeit, diese Angabe getrennt für die Eingabe, die Ausgabe oder beide gemeinsam vorzunehmen. Wiederum erkennen Sie dies am vorangestellten i oder o. Die Tabelle "Trenner" listet die entsprechenden Parameter auf.

Trenner

Aufgabe Angabe Hinweise
Satztrenner --rs etwa lf oder '\r\n'
Feldtrenner --fs etwa ',' oder ';'
Paartrenner --ps nur relevant bei DKVP-Dateien

Die Syntax von mlr verwendet Kommandos mit eigenen Optionen. Diese müssen Sie "bündig" mit dem Kommando absetzen. Die Tabelle "Miller: Kommandoübersicht" zeigt eine Auswahl von Kommandos für mlr. Für die wichtigsten davon stellen wir im Folgenden einige Beispiele vor, wobei als zu verarbeitende Dateien die Files mit den im Kasten "Datenbasis der Beispiele" gezeigten Inhalten dienten.

Miller: Kommandoübersicht

Kommando Optionen Funktion/Hinweise
cat   wie Shell-Befehl cat
  -n fügt links eine weitere Spalte mit aufsteigender Nummerierung hinzu
  -N Name wie -n, aber mit Name für die Spalte mit der Nummerierung
decimate   verwendet jede zehnte Zeile der Daten
  -n N verwendet jede Nte Zeile der Daten
cut   ähnlich wie Shell-Befehl cut
  -f Name,... nur die Felder mit diesem Spaltennamen ausgeben
  -o vor -f: die Felder zusätzlich in der angegebenen Reihenfolge ausgeben
  -x vor -f: die angegebenen Felder nicht ausgeben
filter   Ausgabe von Datenzeilen mit den angegebenen Merkmalen
  'FNR == N' gibt jeweils die Nte Zeile aus
grep   wie Shell-Befehl grep, aber mit weniger Funktionsumfang
  -v gibt nicht übereinstimmende Zeilen aus
group-by   gibt identische Zeilen gruppiert aus
group-like   gibt Zeilen mit identischen Bezeichnern aus
head   gibt den Anfang einer Datei aus
  -n Zeilen Anzahl der Zeilen ohne Kopfzeile (obligatorisch)
join   Zeilen zweier Dateien über eine gemeinsame Spalte verbinden
  -u verarbeitet unsortierte Eingaben
  -j Spalte,... Angabe gemeinsamer Felder
  -f Datei Angabe der links stehenden Datei
rename Alt,Neu   Feldbezeichner umbenennen
  -r Angabe des alten Feldnamens als regulärer Ausdruck
reorder   Änderung der Spaltenreihenfolge
  -f Spalten Angabe der Reihenfolge (obligatorisch)
  --e angegebene Spalten am Schluss der Zeile ausgeben
sample   Ausgabe einer Zahl von Zeilen in beliebiger Position
  -k Zeilen Angabe der Zeilenanzahl, Überschriften nicht eingerechnet
sort   Sortierung
  -f Name,... aufsteigend nach angegebenen Spalten, Zeichen aller Art
  -f Name,... absteigend nach angegebenen Spalten, Zeichen aller Art
  -nf Name,... aufsteigend nach angegebenen Spalten, numerisch
  -nr Name,... absteigend nach angegebenen Spalten, numerisch
stats1   Berechnungen
  -a sum -f Spalte,... Summe
  -a count -f Spalte,... Anzahl der Datensätze/Zeilen
  -a mean -f Spalte,... Durchschnitt
  -a min -f Spalte,... Minimum
  -a max -f Spalte,... Maximum
step   schrittweise Ausgabe von Rechenergebnissen
  --a rsum -f Spalte,... Zwischensumme, Ausgabe je Zeile
  --a delta -f Spalte,... Differenz zwischen zwei aufeinanderfolgenden Zeilen
  --a ratio -f Spalte,... Verhältnis zweier aufeinanderfolgender Zeilen
  --a counter -f Spalte,... laufende Ausgabe der Zahl der Datensätze
  --a <from-first -f Spalte,... Differenz zum ersten ausgegebenen Datensatz
tac   wie Shell-Befehl tac (Ausgabe in umgekehrter Reihenfolge)
tail   Ausgabe des Dateiendes (Gegenstück zu head)
  -n Zeilen Anzahl der Zeilen ohne Überschrift
top   Ausgabe von Zeilen/Datensätzen mit dem höchsten oder geringsten numerischen Wert
  -f Spalte,... Angabe der Spalten mit passenden numerischen Werten
  -a alle Spalten einer Zeile ausgeben
  --min Ausgabe des kleinsten numerischen Wertes
  -n Zeilen Anzahl der auszugebenden Zeilen
uniq   gleiche Datensätze zusammengefasst ausgeben
  -g Spalte,... Angabe der auszuwertenden Spalten
  -n nur Zahl der auszugebenden, zusammengefassten Datensätze ermitteln
  -c zu jedem zusammengefassten Datensatz die Zahl seines Vorkommens angeben
bar   Ausgabe numerischer Werte als ASCII-Balkengrafik
  -f Spalte Angabe der Spalte mit den numerischen Werten
  -c Zeichen Angabe des Balkenzeichens (Standard: *)
  -x Zeichen Angabe des Zeichens für Werte außerhalb des Darstellungsbereichs, (Standard: #)
  -b Zeichen Angabe des Füllzeichens (Standard: .)
  -w Balkenbreite Angabe der Balkenbreite, Standard: 40
  --lo Wert Anfangswert Balkendarstellung
  --high Wert Endwert Balkendarstellung

Datenbasis der Beispiele

### csv1.txt
erste,zweite,dritte
a,b,c
d,e,f
### csv2.txt
erste,zweite,dritte
1,2,3
4,5,6
### csv3.txt
Name,Vorname,Beitrag
Müller,Hans,12.34
Meier,Klaus,56.78
Bauer,Stefan,90.12
### csv4.txt
Name,Vorname,Beitrag
Schmidt,Johann,12.34
Meier,Klaus,56.78
Albert,Stefan,90.12
### dkvp1.txt
a=1,b=2,c=3
d=4,e=5,f=6
### dkvp2.txt
a=1,b=2,c=3
d=4,e=5
f=7,g=8,h=9

Daten ausgeben

Mit dem Kommando cat lesen Sie Textdateien aus und geben diese – gegebenenfalls entsprechend formatiert – in eine Pipe, eine Datei oder auf dem Bildschirm aus. Mit dem Aufruf aus der ersten Zeile von Listing 1 geben Sie die beiden angegebenen Dateien hintereinander mitsamt der Spaltenüberschriften aus (Abbildung 1). Darüber hinaus fügt Miller eigenmächtig numerische Bezeichner für die Felder hinzu.

Abbildung 1: Das Miller-Kommando cat gibt ohne weitere Optionen den Inhalt einer Datei aus.

Listing 1

$ mlr cat csv1.txt csv2.txt
$ mlr --csv --rs lf cat csv1.txt csv2.txt
$ mlr --opprint cat csv1.txt csv2.txt
$ mlr --opprint --csv --rs lf cat csv1.txt csv2.txt
$ mlr --csv --rs lf --opprint cat csv1.txt csv2.txt
$ mlr --icsv --rs lf --odkvp cat csv1.txt > neudkvp.txt
$ mlr --idkvp --ocsv --rs lf cat dkvp1.txt > neucsv.txt
$ mlr --icsv --rs lf --oxtab cat csv3.txt > neuxtab.txt

Geben Sie gleichzeitig den Dateityp (hier csv) und das Trennzeichen für die Datensätze den Zeilenvorschub (--rs lf) an, unterlässt Miller die Nummerierung (Listing 1, Zeile 2). Außerdem fasst es identische Spaltenüberschriften zu einer einzigen zusammen (Abbildung 2).

Abbildung 2: Geben Sie den Dateityp und das Trennzeichen für die Datensätze als Parameter an, ermöglicht das eine verbesserte Ausgabe.

Mit der Option --opprint bekommen Sie eine noch übersichtlichere Ausgabe (Listing 1, Zeile 3), die jedoch noch kleine Fehler aufweist. Hier fügt das Programm eigene Spaltenüberschriften ein (Abbildung 3, erste Zeile). Die in den Ausgangsdateien vorhandenen Überschriften listet Miller wie Datensätze auf.

Abbildung 3: Eine optisch etwas aufgewertete Ausgabe überzeugt bis auf kleine Patzer.

Die Reihenfolge der Optionen wirkt sich auf das Ergebnis aus (Abbildung 4). Während mit dem Aufruf aus der vierten Zeile von Listing 1 die Option --opprint anscheinend unbeachtet bleibt, funktioniert es umgekehrt richtig (Listing 1, Zeile 5): Die Software fasst die identischen Überschriften zusammen und zeigt die Werte mit Abstand an, passend zur Überschrift.

Abbildung 4: Die Reihenfolge, in der Sie die Optionen angeben, hat eine Auswirkung auf das Ergebnis.

Miller konvertiert

Mittels cat konvertiert Miller die in der Tabelle "Datenstrukturen" aufgeführten Formate. Dazu setzen Sie vor die Bezeichnung für die Eingabe ein i, vor die für die Ausgabe ein o. Aus einer CSV-Datei entsteht auf diesem Wege eine im DKVP-Format (Listing 1, Zeile 6). Der umgekehrte Weg funktioniert auf dieselbe Weise (Listing 1, Zeile 7).

Das Umsetzen in die zeilenweise Anzeige (XTAB-Format) erweist sich beispielsweise beim Erstellen von Nicht-GUI-Anwendungen als sehr hilfreich, etwa bei einer Abfrage von Adressen (Listing 1, Zeile 8). Die abgearbeiteten Beispiele finden Sie in der Abbildung 5.

Abbildung 5: Miller konvertiert Datenstrukturen auf einfache Weise von einem Format in ein anderes.

LinuxCommunity kaufen

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

Deutschland

Ähnliche Artikel

  • Sauber verzahnt
    Verbinden, trennen, umformatieren: Unter Linux gibt es zahlreiche kleine Helfer, die die Arbeit mit Textdateien perfekt beherrschen – und die dazu noch perfekt zusammenarbeiten.
  • 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.
  • Durchblick im Quellcode dank Syntax-Highlighting
    Quellcode liest sich oft schwer. Eine Syntaxhervorhebung macht klar, worauf es ankommt.
  • Mehr Komfort
    Von einfachen Abfragen bis hin zu komplexen Menüs: Mit dem Toolkit Dialog bauen Sie eine grafische Oberfläche für Shell-Skripte, die oft nicht mehr als eine zusätzliche Zeile brauchen.
  • LaTeX mit Daten aus externen Quellen anreichern
    Ob Serienbrief oder Teilnehmerliste – mit dem richtigen Adapter befüllen Sie LaTeX-Dokumente problemlos mit den Feldinhalten einer Datenbank und erstellen so Druckerzeugnisse in perfekter Qualität.
Kommentare

Infos zur Publikation

LU 07/2017: VIDEOSCHNITT

Digitale Ausgabe: Preis € 0,00
(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!

Aktuelle Fragen

scannen mit LINUXMINT 18.0 - Brother DCP - 195 C
Christoph-J. Walter, 21.06.2017 08:47, 4 Antworten
Seit LM 18.0 kann ich nicht mehr direkt scannen. Obwohl ich die notwendigen Tools von der Brothe...
Anfänger Frage
Klaus Müller, 24.05.2017 14:25, 2 Antworten
Hallo erstmal. Habe von linux nicht so viel erfahrung müsste aber mal ne doofe frage stellen. A...
Knoppix-Live-CD (8.0 LU-Edition) im Uefiboot?
Thomas Weiss, 26.04.2017 20:38, 4 Antworten
Hallo, Da mein Rechner unter Windows 8.1/64Bit ein Soundproblem hat und ich abklären wollte, o...
Grub2 reparieren
Brain Stuff, 26.04.2017 02:04, 7 Antworten
Ein Windows Update hat mir Grub zerschossen ... der Computer startet nicht mehr mit Grub, sondern...
Linux open suse 2,8
Wolfgang Gerhard Zeidler, 18.04.2017 09:17, 2 Antworten
Hallo.bitte um Hilfe bei. Code fuer den Rescue-login open suse2.8 Mfg Yvo