Da Sie mit Aufzeichnungen zu tun haben, awk
ist 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 gsub
Funktion entfernt werden. Das $1=$1
zwingt ihn, den Datensatz mit dem neuen Ausgabefeldtrennzeichen neu zu kompilieren, das wie ;
im BEGIN-Block definiert wurde. Dann print
druckt 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 }'
NF
ist 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=$1
Konstrukt 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 .