Ich arbeite an einem langen Bash-Skript. Ich möchte Zellen aus einer CSV-Datei in Bash-Variablen lesen. Ich kann Zeilen und die erste Spalte analysieren, aber keine andere Spalte. Hier ist mein Code bisher:
cat myfile.csv|while read line
do
read -d, col1 col2 < <(echo $line)
echo "I got:$col1|$col2"
done
Es wird nur die erste Spalte gedruckt. Als zusätzlichen Test habe ich Folgendes versucht:
read -d, x y < <(echo a,b,)
Und $ y ist leer. Also habe ich versucht:
read x y < <(echo a b)
Und $ y ist b
. Warum?
awk
zu verwenden$1
,$2
usw.?Antworten:
Sie müssen
IFS
anstelle von verwenden-d
:Beachten Sie, dass Sie für das allgemeine CSV-Parsen ein spezielles Tool verwenden sollten, das Anführungszeichen mit internen Kommas verarbeiten kann, unter anderem Probleme, die Bash nicht selbst behandeln kann. Beispiele für solche Werkzeuge sind
cvstool
undcsvkit
.quelle
command not found
. Nur dieecho
Werke.;
:while IFS=";" read col1 col2; do ...
${var}
), aber ich lasse sie weg, wenn sie nicht erforderlich sind. Für mich sieht es sauberer aus.Von der
man
Seite:Sie verwenden,
-d,
wodurch die Eingabezeile auf dem Komma beendet wird. Der Rest der Zeile wird nicht gelesen. Deshalb ist $ y leer.quelle
Wir können CSV-Dateien mit in Anführungszeichen gesetzten Zeichenfolgen analysieren, die durch say | begrenzt sind mit folgendem Code
awk analysiert die Zeichenfolgenfelder in Variablen und tr entfernt das Anführungszeichen.
Etwas langsamer als awk für jedes Feld ausgeführt wird.
quelle
Wenn Sie eine CSV-Datei mit einigen Zeilen lesen möchten, ist dies die Lösung.
quelle