Vielleicht habe ich Pech, weil meine in Anführungszeichen und durch Kommas getrennte CSV-Datei im Nutztext doppelte Anführungszeichen und Kommas enthält.
Also möchte ich Folgendes ändern:
"record 1","name 1","text 1, text 2"
"record 2","name ""2""","text 2"
"record 3","name 3",""
auf diesem:
"record 1","name 1","text 1, text 2"
"record 2","name 2","text 2"
"record 3","name 3",""
Beachten Sie, dass ich die doppelten Anführungszeichen aus name ""2""
„to“ entfernt habe name 2
, die doppelten Anführungszeichen aus Zeile 3 jedoch beibehalten habe:,""
Antwort1
Verwenden Sie csvformat
, um die Trennzeichen in Tabulatoren ( csvformat -T
) umzuwandeln, alle doppelten Anführungszeichen ( tr -d '"'
) zu entfernen und die Trennzeichen dann durch Kommas zurückzusetzen, wobei jedes Feld in Anführungszeichen gesetzt wird (das letzte Stück der Pipeline):
$ csvformat -T file.csv | tr -d '"' | csvformat -t -U1
"record 1","name 1","text 1, text 2"
"record 2","name 2","text 2"
"record 3","name 3",""
csvformat
ist ein Teil voncsvkit
.
Antwort2
Dies funktioniert unabhängig davon, welche Zeichen Ihre Eingabe enthält (außer Zeilenumbrüchen innerhalb von Feldern mit Anführungszeichen, aber das ist ein ganz anderes Problem).
Mit GNU awk für FPAT:
$ awk -v FPAT='("[^"]*")+' -v OFS='","' '{
for ( i=1; i<=NF; i++ ) {
gsub(/"/,"",$i)
}
print "\"" $0 "\""
}' file
"record 1","name 1","text 1, text 2"
"record 2","name 2","text 2"
"record 3","name 3",""
oder das Äquivalent mit jedem awk:
$ awk -v OFS='","' '{
orig=$0; $0=""; i=0;
while ( match(orig,/("[^"]*")+/) ) {
$(++i) = substr(orig,RSTART,RLENGTH)
gsub(/"/,"",$i)
orig = substr(orig,RSTART+RLENGTH)
}
print "\"" $0 "\""
}' file
"record 1","name 1","text 1, text 2"
"record 2","name 2","text 2"
"record 3","name 3",""
Siehe auchWas ist der robusteste Weg, CSV mithilfe von AWK effizient zu analysieren?.