Startseite>Mit Miller strukturierte Textdateien verarbeiten
Aus Raspberry Pi Geek 05/2016

Mit Miller strukturierte Textdateien verarbeiten

© Kostic Dusan, 123RF

Immer schön der Reihe nach

Harald Zisler

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.

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.

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.

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.

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

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 6 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
€0,99 – Kaufen
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland