Mit Miller strukturierte Textdateien verarbeiten

© Kostic Dusan, 123RF

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.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 6 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Raspberry Pi Geek kaufen

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

Deutschland

Ähnliche Artikel

  • Shell-Workshop, Teil 3

    Kleine Shell-Tools helfen in vielen Alltagssituationen. Unser Kurs stellt die wichtigsten Kommandos vor.

  • Alltagsaufgaben mit Bordmitteln lösen

    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.

  • Aktuelle Software im Kurztest

    Zertifikatsmanager Certmgr 0.2.58, Streaming-Video-Downloader Clive 2.3.3, Webgalerie-Generator Fgallery 1.8.2, Website-Kopierer Httraqt 1.4.7, Packprogramm Lzip 1.18, CSV-Werkzeugkasten Miller 4.1.0, Prozessfernsteuerung Ssh-cron 1.01, Systemmonitor Sysstat 11.3.5.

  • Mit Journalctl die Systemd-Protokolle auswerten

    Das Journal sammelt alle Meldungen von Systemd. Hier finden Sie ausführlichere Protokolle als bei SysVinit, die früher einsetzen und gezielte Suchen erlauben.

  • Menüs und Masken in der Shell nutzen mit Dialog

    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.

Aktuelle Ausgabe

06/2019
Home Improvement

Diese Ausgabe als PDF kaufen

Preis € 9,99
(inkl. 19% MwSt.)

Stellenmarkt

Neuigkeiten

  • Verschlungene Pfade

    Mit Schleifen, Fallunterscheidungen und Funktionen programmieren Sie komplexe Skripte auf einfache und elegante Weise.

  • Extrem genau

    Mit einem A/D-Wandler messen Sie bei Bedarf Spannungen. Der MCP3424 macht dabei konstruktionsbedingt eine gute Figur.

  • Verbindungsaufnahme

  • Süßer Wecker

    Dem RasPi fehlen sowohl eine Echtzeituhr als auch ein BIOS, ein zeitgesteuertes Wecken erfordert also Zusatzkomponenten. Hier springt der Witty Pi Mini in die Bresche, ein µHAT von UUGear.

  • Windows to go

    Das Aufsetzen zuverlässiger und sicherer Remote-Desktop-Lösungen erfordert einiges Know-how. Die RasPi-basierte Pinbox von Pintexx reduziert den Konfigurationsaufwand auf ein Minimum.

  • Prima Klima

    In Museen ist es Pflicht, zu Hause nützlich: das permanente Prüfen und zentrale Erfassen der Feuchtigkeit und Temperatur in Räumen.

  • Auf einen Blick

    Ein maßgeschneiderter Infoscreen auf RasPi-Basis mit stromsparendem E-Ink-Display zeigt Termine, Bilder, Mitteilungen und Wetterinformationen an.

  • Sanft berührt

    Mit einem RasPi und dem Controllermodul PiXtend lassen sich mühelos Roboterarme ansteuern und deren Bewegung automatisieren.

  • Popcorn-Kino

    Mit Kodi 18.0 unterstützt LibreELEC 9.0 jetzt die von vielen Streaming-Diensten genutzte DRM-Verschlüsselung. Die Integration von Netflix, Amazon und Co. erfordert allerdings Handarbeit.

  • So nah und doch so fern

    Der RasPi kommt häufig als Server oder Steuerrechner für spezielle Zwecke zum Einsatz. Mit Anydesk erhalten Sie dazu eine Steuersoftware mit grafischer Oberfläche.