
Wie iteriert man durch eine Datei, deren Werte durch Kommas getrennt sind?
Ich habe Folgendes versucht:
$ cat file | tr ',' '\n' > /tmp/f1
$ while read -r line;do
echo $line;
done < /tmp/f1
Wie kann ich über den Inhalt der ersten Zeile iterieren, ohne eine temporäre Datei zu erstellen?
Irgendwelche Ideen?
Antwort1
Erstens,Vermeiden Sie die Textanalyse mit Shell-Schleifen. Das ist schwer zu machen, man kann leicht Fehler machen und es ist sehr schwer zu lesen. Und langsam. Sehr, sehr langsam. Verwenden Sie stattdessen etwas wie , awk
das speziell für das Lesen nach „Feldern“ entwickelt wurde. Zum Beispiel mit dieser Eingabedatei:
foo, bar, baz
oof, rab, zab
Sie können jedes durch Kommas getrennte Feld lesen, indem Sie awk -F,
den Feldtrenner wie folgt festlegen ,
:
$ awk -F, '{ print "The 1st field is",$1,"the 2nd", $2,"and the 3rd", $3}' file
The 1st field is foo the 2nd bar and the 3rd baz
The 1st field is oof the 2nd rab and the 3rd zab
Auch wenn Sie darauf bestehen, es in der Shell zu tun, brauchen Sie weder die temporäre Datei noch tr
. Sie können angeben, while read
dass dies durch Kommas getrennt werden soll:
$ while IFS=, read -r one two three; do
echo "The 1st field is $one, the 2nd $two and the 3rd $three";
done < file
The 1st field is foo, the 2nd bar and the 3rd baz
The 1st field is oof, the 2nd rab and the 3rd zab
Antwort2
Felder in einer CSV-Datei können mehrere Zeilen umfassen. Aus diesem und anderen Gründen verwende ich am liebstenxsvals ich CSV analysieren musste.
Eine Möglichkeit zum Parsen einer CSV-Datei mit Bash und XSV kann sein:
csvFile="myfile.csv"
lengthItems=$((($(xsv count "$csvFile") - 1 ))) # -1 because for loop start at 0
for i in $( seq 0 "$lengthItems" ); do
row="$(xsv slice -i "$i" "$csvFile")" # real magic happening here
# Do what you want with your $row here
done