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 |
|---|---|
|
|
Bezeichner mit Wertzuweisungen, Komma als Feldtrenner ( |
|
|
numerische Feldbezeichner, Komma als Feldtrenner ( |
|
|
keine Feldbezeichner, Text optional in Anführungszeichen, Komma als Feldtrenner ( |
|
|
formatierte Ausgabe durch Miller, erzeugt Tabellen |
|
|
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 |
|
etwa |
|
Feldtrenner |
|
etwa |
|
Paartrenner |
|
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 |
|---|---|---|
|
|
|
wie Shell-Befehl |
|
|
|
fügt links eine weitere Spalte mit aufsteigender Nummerierung hinzu |
|
|
|
wie |
|
|
|
verwendet jede zehnte Zeile der Daten |
|
|
|
verwendet jede |
|
|
|
ähnlich wie Shell-Befehl |
|
|
|
nur die Felder mit diesem Spaltennamen ausgeben |
|
|
|
vor |
|
|
|
vor |
|
|
|
Ausgabe von Datenzeilen mit den angegebenen Merkmalen |
|
|
|
gibt jeweils die |
|
|
|
wie Shell-Befehl |
|
|
|
gibt nicht übereinstimmende Zeilen aus |
|
|
|
gibt identische Zeilen gruppiert aus |
|
|
|
gibt Zeilen mit identischen Bezeichnern aus |
|
|
|
gibt den Anfang einer Datei aus |
|
|
|
Anzahl der Zeilen ohne Kopfzeile (obligatorisch) |
|
|
|
Zeilen zweier Dateien über eine gemeinsame Spalte verbinden |
|
|
|
verarbeitet unsortierte Eingaben |
|
|
|
Angabe gemeinsamer Felder |
|
|
|
Angabe der links stehenden Datei |
|
|
|
Feldbezeichner umbenennen |
|
|
|
Angabe des alten Feldnamens als regulärer Ausdruck |
|
|
|
Änderung der Spaltenreihenfolge |
|
|
|
Angabe der Reihenfolge (obligatorisch) |
|
|
– |
angegebene Spalten am Schluss der Zeile ausgeben |
|
|
|
Ausgabe einer Zahl von Zeilen in beliebiger Position |
|
|
|
Angabe der Zeilenanzahl, Überschriften nicht eingerechnet |
|
|
|
Sortierung |
|
|
|
aufsteigend nach angegebenen Spalten, Zeichen aller Art |
|
|
|
absteigend nach angegebenen Spalten, Zeichen aller Art |
|
|
|
aufsteigend nach angegebenen Spalten, numerisch |
|
|
|
absteigend nach angegebenen Spalten, numerisch |
|
|
|
Berechnungen |
|
|
|
Summe |
|
|
|
Anzahl der Datensätze/Zeilen |
|
|
|
Durchschnitt |
|
|
|
Minimum |
|
|
|
Maximum |
|
|
|
schrittweise Ausgabe von Rechenergebnissen |
|
|
– |
Zwischensumme, Ausgabe je Zeile |
|
|
– |
Differenz zwischen zwei aufeinanderfolgenden Zeilen |
|
|
– |
Verhältnis zweier aufeinanderfolgender Zeilen |
|
|
– |
laufende Ausgabe der Zahl der Datensätze |
|
|
– |
Differenz zum ersten ausgegebenen Datensatz |
|
|
|
wie Shell-Befehl |
|
|
|
Ausgabe des Dateiendes (Gegenstück zu |
|
|
|
Anzahl der Zeilen ohne Überschrift |
|
|
|
Ausgabe von Zeilen/Datensätzen mit dem höchsten oder geringsten numerischen Wert |
|
|
|
Angabe der Spalten mit passenden numerischen Werten |
|
|
|
alle Spalten einer Zeile ausgeben |
|
|
|
Ausgabe des kleinsten numerischen Wertes |
|
|
|
Anzahl der auszugebenden Zeilen |
|
|
|
gleiche Datensätze zusammengefasst ausgeben |
|
|
|
Angabe der auszuwertenden Spalten |
|
|
|
nur Zahl der auszugebenden, zusammengefassten Datensätze ermitteln |
|
|
|
zu jedem zusammengefassten Datensatz die Zahl seines Vorkommens angeben |
|
|
|
Ausgabe numerischer Werte als ASCII-Balkengrafik |
|
|
|
Angabe der Spalte mit den numerischen Werten |
|
|
|
Angabe des Balkenzeichens (Standard: |
|
|
|
Angabe des Zeichens für Werte außerhalb des Darstellungsbereichs, (Standard: |
|
|
|
Angabe des Füllzeichens (Standard: |
|
|
|
Angabe der Balkenbreite, Standard: 40 |
|
|
|
Anfangswert Balkendarstellung |
|
|
|
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.
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.
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.






