Tools für die Kommandozeilen-Datei in Cygwin Parsen
Frage
Ich habe mit Textdateien in einer bunten Auswahl von Formaten beschäftigen. Hier ist ein Beispiel (Spalten A und B ist Tabulator getrennt):
A B
a Name1=Val1, Name2=Val2, Name3=Val3
b Name1=Val4, Name3=Val5
c Name1=Val6, Name2=Val7, Name3=Val8
Die Dateien könnten Header haben oder nicht, haben abgrenzt Schemata gemischt, haben Spalten mit Name / Wert-Paare wie oben usw.
Ich habe oft die Ad-hoc-Daten aus solchen Dateien auf verschiedene Weise zu extrahieren. Zum Beispiel aus den obigen Daten kann ich den Wert mit Name2 zugeordnet werden soll, wo es vorhanden ist. d.
A B
a Val2
c Val7
Welche Werkzeuge / Techniken gibt es zur Durchführung einer solchen Manipulationen als eine Zeilenbefehle, unter Verwendung der oben als Beispiel aber erweiterbar auf andere Fälle?
Lösung
Ich mag nicht zu viel sed, aber es funktioniert für solche Dinge:
var="Name2";sed -n "1p;s/\([^ ]*\) .*$var=\([^ ,]*\).*/\1 \2/p" < filename
Gibt Ihnen:
A B
a Val2
c Val7
Andere Tipps
Sie haben alle grundlegenden bash-Shell-Befehle, zum Beispiel grep, schneiden, sed und awk zur Verfügung. Sie können auch Perl oder Ruby für komplexere Dinge verwenden.
Von dem, was ich gesehen habe ich mit Awk für diese Art der Sache beginnen würde und dann, wenn Sie etwas komplexer brauchen, würde ich zu Python Fortschritt.
Ich würde verwenden sed:
# print section of file between two regular expressions (inclusive)
sed -n '/Iowa/,/Montana/p' # case sensitive
Da Sie Cygwin haben, würde ich mit Perl gehen. Es ist die einfachste des O'Reily Buch zu lernen (check out: Learning Perl ) und breit anwendbar.
Ich würde Perl verwenden. Schreibe ein kleines Modul (oder mehr) für die unterschiedlichen Formate handeln. Sie könnten dann Perl Einzeiler laufen diese Bibliothek verwenden. Beispiel für das, was würde es aussehen wie folgt:
perl -e 'use Parser;' -e 'parser("in.input").get("Name2");'
zitieren Sie mich nicht auf die Syntax, aber das ist die allgemeine Idee. Zusammenfassung der Aufgabe in der Hand, damit Sie in Bezug auf die denken, was Sie tun müssen, nicht, wie Sie es tun müssen. Rubin wäre eine weitere Option, es neigt dazu, eine sauberere Syntax zu haben, aber entweder Sprache funktionieren würde.