Strumenti per la riga di comando l'analisi dei file in cygwin
Domanda
Devo avere a che fare con i file di testo in un vasto assortimento di formati.Ecco un esempio (Colonne Un e B sono delimitati da tabulazioni):
A B
a Name1=Val1, Name2=Val2, Name3=Val3
b Name1=Val4, Name3=Val5
c Name1=Val6, Name2=Val7, Name3=Val8
Il file potrebbe avere intestazioni o non, si sono mescolati per la delimitazione di schemi, avere le colonne di coppie nome/valore come sopra etc.
Ho spesso l'ad-hoc bisogno di estrarre i dati da questi file in vari modi.Per esempio, dai dati di cui sopra si desidera conoscere il valore associato con Nome2, dove è presente.cioè
A B
a Val2
c Val7
Quali strumenti/tecniche esistono per l'esecuzione di tali manipolazioni come una riga comandi, utilizzando il sopra come esempio, ma estendibile anche ad altri casi?
Soluzione
Non mi piace sed troppo, ma funziona per queste cose:
var="Name2";sed -n "1p;s/\([^ ]*\) .*$var=\([^ ,]*\).*/\1 \2/p" < filename
Ti offre:
A B
a Val2
c Val7
Altri suggerimenti
Hai tutti i comandi bash, per esempio grep, cut, sed e awk a tua disposizione.È inoltre possibile utilizzare Perl o Ruby per cose più complesse.
Da quello che ho visto mi piacerebbe iniziare con Awk per questo genere di cose, quindi se avete bisogno di qualcosa di più complesso, mi piacerebbe corso di Python.
Vorrei usare sed:
# print section of file between two regular expressions (inclusive)
sed -n '/Iowa/,/Montana/p' # case sensitive
Dal momento che si dispone di cygwin, mi piacerebbe andare con Perl.È il più facile da imparare (check out O'Reily libro: Learning Perl) e ampiamente applicabile.
Vorrei usare il Perl.Scrivi un modulo di piccole dimensioni (o più di uno) per affrontare i diversi formati.Si potrebbe quindi correre perl oneliners che utilizzano questa libreria.Esempio per quello che sarebbe sembrano, come segue:
perl -e 'use Parser;' -e 'parser("in.input").get("Name2");'
Non ci metterei la mano sul sintassi, ma l'idea generale.Abstract il compito a portata di mano per consentire di pensare in termini di ciò che è necessario fare, e non hai bisogno di farlo.Ruby sarebbe un'altra opzione, tende ad avere un pulitore di sintassi, ma in ogni lingua di lavoro.