2008-09-17 8 views
0

Ich muss mit Textdateien in einer bunten Auswahl von Formaten umgehen. Hier ist ein Beispiel (Spalten A und B Lasche begrenzt sind):Tools für die Kommandozeilen-Datei in cygwin Parsing

A B 
a Name1=Val1, Name2=Val2, Name3=Val3 
b Name1=Val4, Name3=Val5 
c Name1=Val6, Name2=Val7, Name3=Val8 

Die Dateien Header haben können oder nicht, gemischt Schemata begrenzen, haben Spalten mit Namen/Wert-Paare, wie oben usw.
Ich habe oft den Ad-hoc-Bedarf, Daten aus solchen Dateien auf verschiedene Arten zu extrahieren. Zum Beispiel möchte ich aus den obigen Daten den Wert, der mit Name2 verknüpft ist, wo er vorhanden ist, haben wollen. das heißt

A B 
a Val2 
c Val7 

Welche Werkzeuge/Techniken gibt es zur Durchführung einer solchen Manipulationen als eine Zeilenbefehle, die oben als Beispiel aber erweiterbar auf andere Fälle verwendet?

Antwort

1

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 
1

Sie haben alle grundlegenden Bash Shell-Befehle, zum Beispiel grep, cut, sed und awk, zur Verfügung. Sie können auch Perl oder Ruby für komplexere Dinge verwenden.

0

Von dem, was ich gesehen habe, würde ich mit Awk für diese Art von Sache beginnen, und wenn Sie etwas Komplexeres brauchen, würde ich zu Python fortschreiten.

0

Ich würde verwenden sed:

# print section of file between two regular expressions (inclusive) 
    sed -n '/Iowa/,/Montana/p'    # case sensitive 
0

Da Sie Cygwin habe ich mit Perl gehen würde. Es ist am einfachsten zu lernen (siehe O'Reily Buch: Learning Perl) und weit verbreitet.

0

ich Perl verwenden würde. Schreiben Sie ein kleines Modul (oder mehrere) für die verschiedenen Formate. Sie könnten dann perl oneliner mit dieser Bibliothek ausführen. 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. Stellen Sie die Aufgabe zusammen, damit Sie in dem Sinne denken können, was Sie tun müssen und nicht wie Sie es tun müssen. Ruby wäre eine andere Option, es hat tendenziell eine sauberere Syntax, aber jede der beiden Sprachen würde funktionieren.