2010-12-14 3 views
8

Hallo ein Shell-Skript benötigen durch die CSV-Datei zu analysieren - Zeile für Zeile und dann Feld für Feld]Shell-Skript über eine Datei (CSV) und Prozess Zeile für Zeile zu analysieren

die Datei wie folgt

aussehen
X1,X2,X3,X4 
Y1,Y2,Y3,Y4 

ich brauche jede dieser X1, X2 zu extrahieren ....

ich ein Drehbuch geschrieben, aber es schlägt fehl, wenn die Zeile eine Zeile überschreitet ..

+2

Die gute Nachricht: zwei Programme, [awk] (http://www.vectorsite.net/tsawk.html) und [sed] (http://www.grymoire.com/Unix/Sed.html), existieren, genau das zu tun. Die schlechte Nachricht: Sie sind unmöglich zu lernen. Ich stelle das nicht als Antwort dar, weil es das wirklich nicht ist; hoffentlich wird jemand unter Ihnen die korrekte awk/sed Syntax veröffentlichen, die Sie in Ihrem spezifischen Problem verwenden können. – eykanal

+1

'sed' kann schwierig zu lernen sein, aber' awk' ist nicht. Awk ist eigentlich ziemlich einfach. Obwohl Sie dies nicht unbedingt tun müssen, wie dies bei Shell-Einbauten der Fall ist (siehe Ignacios Antwort unten). –

Antwort

27

Hier ist, wie ich es tun würde.

Zuerst habe ich die IFS-Umgebungsvariable gesetzt, um read zu sagen, dass "," das Feldtrennzeichen ist.

export IFS="," 

die Datei „Eingang“ Angesichts der Daten enthält, die Sie zur Verfügung gestellt, kann ich den folgenden Code verwenden:

cat test | while read a b c d; do echo "$a:$b:$c:$d"; done 

schnell rekapitulieren, was oben vor sich geht. cat test | liest die Datei und leitet sie an while. while führt den Code zwischen do und done, während read True zurückgibt. read liest eine Zeile aus der Standardeingabe und trennt sie in Variablen ("a", "b", "c" und "d") entsprechend dem Wert von $ IFS. Schließlich zeigt echo nur die Variablen an, die wir gelesen haben.

die mir die folgende Ausgabe

X1:X2:X3:X4 
Y1:Y2:Y3:Y4 

BTW gibt, die BASH manual ist immer gut zu lesen. Du wirst jedes Mal etwas Neues lernen, wenn du es liest.

+4

[UUOC] (http://en.wikipedia.org/wiki/Cat_%28Unix%29#Useless_use_of_cat) - Sie brauchen diese Katze nicht :-) –

+1

@Chris: Ich weiß! Nur zur persönlichen Vorliebe, aus Gründen der Übersichtlichkeit ... :-) –

+5

Du solltest fast immer '-r' mit' read' verwenden. Sie sollten 'while IFS = ',' read -r a b c d 'machen und Sie müssen den Wert von' IFS 'nicht speichern und wiederherstellen, damit sein Verhalten wieder normal wird. Beachten Sie, dass bei mehr Feldern in Ihren Daten als bei Variablen, dass die letzte Variable auch den Überschuss enthält. –

3

Seit Eykanal erwähnt AWk und und sed, ich dachte, ich würde zeigen, wie Sie sie verwenden könnten.

awk -F, 'BEGIN{OFS="\n"}{$1=$1; print}' inputfile 

oder

sed 's/,/\n/' inputfile 

Dann wird ein Shell-Skript konnte ihre Leistung verarbeiten:

awk_or_sed_cmd | while read -r field 
do 
    do_something "$field" 
done 

Natürlich könnten Sie die Verarbeitung innerhalb des AWK-Skript tun:

awk -F, '{for (i=1;i<=NF;i++) do_something($i)}' inputfile 
0

ls -l

vi filename.sh

#!bin/sh

"Eingangsmuster"

cat> Test (Eingangsdaten und speichern)

Katze Test echo | while read (input); (Beispiel: "$ a: $ b: $ c: $ d");

getan

echo "-Muster dargestellt als "$ a: $ b: $ c: $ D" \ n"

Ausgang (0;);

Verwandte Themen