Da Sie mit Aufzeichnungen zu tun haben, awkist dies sinnvoller. Das heißt, es ist nicht wirklich gut in CSV, da die Feldbegrenzer etwas variabel sind. Wenn Sie jedoch sicher sind, dass alle Felder von doppelten Anführungszeichen umgeben sind, funktioniert dies:
awk -F'","' 'BEGIN {OFS=";"} { gsub(/(^")|("$)/, ""); $1=$1; print }'
Dies setzt das Eingabefeldtrennzeichen von awk auf " ","" (einschließlich des inneren Satzes von Doppelzitaten). Dies funktioniert fast, außer dass Sie sich mit den führenden und nachfolgenden Doppelzitaten befassen müssen, die mit der gsubFunktion entfernt werden. Das $1=$1zwingt ihn, den Datensatz mit dem neuen Ausgabefeldtrennzeichen neu zu kompilieren, das wie ;im BEGIN-Block definiert wurde. Dann printdruckt den gesamten Datensatz aus.
Das ist etwas aufgeräumter:
awk -F '(^")|(",")|("$)' 'BEGIN {OFS=";"} { $1=$1; print }'
Es setzt das Eingabefeldtrennzeichen auf einen regulären Ausdruck, der die doppelten Anführungszeichen am Anfang und Ende des Datensatzes enthält, bewirkt aber auch, dass ein leeres Anfangs- und Nachlauffeld ausgedruckt wird. Sie können das nachfolgende Feld leicht entfernen:
awk -F '(^")|(",")|("$)' 'BEGIN {OFS=";"} { NF=NF-1; $1=$1; print }'
NFist die Anzahl der Felder, und die Reduzierung um eins springt vom letzten Feld ab. Aber ich kann mir keinen Weg vorstellen, das erste Feld abzuhacken.
Wenn Sie jedoch wissen, dass die Eingabe immer fünf Felder enthält, können Sie dies tun:
awk -F '(^")|(",")|("$)' 'BEGIN {OFS=";"} { print $2,$3,$4,$5,$6 }'
Beachten Sie, dass dadurch das $1=$1Konstrukt entfernt wird, das wir nur benötigen, wenn wir die (implizierten) $ 0 drucken.
Alles in allem würde ich wahrscheinlich Perl und eines der vielen verfügbaren CSV-Module auf CPAN verwenden .