Ich habe eine CSV-Datei mit einem Feld, dessen Daten in " " und Kommas dazwischen eingeschlossen sind. Ich möchte es durch ein anderes ersetzen

Ich habe eine CSV-Datei mit einem Feld, dessen Daten in " " und Kommas dazwischen eingeschlossen sind. Ich möchte es durch ein anderes ersetzen

Unten sind die ersten 5 Zeilen meiner Datei. Hier möchte ich „10,00,000.0“ in der 5. Spalte durch „10,000,000.0“ ersetzen.

DE000A2200V7,09:30:00,8.5,8.509,"10,00,000.0","10,00,000.0","850,450.0"
DE000A2200V7,11:30:00,8.7,8.709,"20,00,000.0","20,000.0","870,450.0"
DE000A2200V7,13:30:00,8.763,8.883,"30,00,000.0","20,000.0","882,300.0"
DE000A2200V7,15:30:00,8.481,8.501,"10,00,000.0","10,00,000.0","849,100.0"
DE000A2200W5,09:30:00,15.826,15.835,"20,000.0","20,000.0","1,583,050.0"

Antwort1

Durch vorübergehendes Ändern des CSV-Trennzeichens in ein @(oder ein beliebiges anderes Zeichen, das noch nicht Teil der Daten ist) mit csvformatfromcsvkit, anschließend im 5. Feld die entsprechenden Strings durch ersetzen awkund als Trennzeichen wieder das ursprüngliche Komma verwenden:

csvformat -D '@' data.csv |
awk 'BEGIN { OFS=FS="@" } $5 == "10,00,000.0" { $5 = "10,000,000.0" }; 1' |
csvformat -d '@'

Mit Ihren Daten in data.csvergibt dies:

DE000A2200V7,09:30:00,8.5,8.509,"10,000,000.0","10,00,000.0","850,450.0"
DE000A2200V7,11:30:00,8.7,8.709,"20,00,000.0","20,000.0","870,450.0"
DE000A2200V7,13:30:00,8.763,8.883,"30,00,000.0","20,000.0","882,300.0"
DE000A2200V7,15:30:00,8.481,8.501,"10,000,000.0","10,00,000.0","849,100.0"
DE000A2200W5,09:30:00,15.826,15.835,"20,000.0","20,000.0","1,583,050.0"

Antwort2

Dies können Sie mit dem folgenden Befehl tun sed:

sed -i 's/^\(\([^,]*,\)\{4\}\)\("[^"]*"\)\(.*\)$/\1"10,000,000.0"\4/' data.csv

Antwort3

Sicher, dass „20,00,000.0“ richtig ist? Wenn nicht, versuchen Sie

sed 's/,00,/,000,/' file

Fügen Sie sdie gFlagge hinzu, wenn alle falschen Nummern behoben werden sollen …

Antwort4

Mit GNUawk

awk -vFPAT='([^,]*)|("[^"]+")' -vOFS=, '$5 == "\"10,00,000.0\"" \
{ $5="\"10,000,000.0\""}; {print}' file

Tests

$ cat file
DE000A2200V7,09:30:00,8.5,8.509,"10,00,000.0","10,00,000.0","850,450.0"
DE000A2200V7,11:30:00,8.7,8.709,"20,00,000.0","20,000.0","870,450.0"
DE000A2200V7,13:30:00,8.763,8.883,"30,00,000.0","20,000.0","882,300.0"
DE000A2200V7,15:30:00,8.481,8.501,"10,00,000.0","10,00,000.0","849,100.0"
DE000A2200W5,09:30:00,15.826,15.835,"20,000.0","20,000.0","1,583,050.0"

$ awk -vFPAT='([^,]*)|("[^"]+")' -vOFS=, '$5 == "\"10,00,000.0\"" { $5="\"10,000,000.0\""}; {print}' file
DE000A2200V7,09:30:00,8.5,8.509,10,000,000.0,"10,00,000.0","850,450.0"
DE000A2200V7,11:30:00,8.7,8.709,"20,00,000.0","20,000.0","870,450.0"
DE000A2200V7,13:30:00,8.763,8.883,"30,00,000.0","20,000.0","882,300.0"
DE000A2200V7,15:30:00,8.481,8.501,10,000,000.0,"10,00,000.0","849,100.0"
DE000A2200W5,09:30:00,15.826,15.835,"20,000.0","20,000.0","1,583,050.0"

Erläuterung

-vFPAT='([^,]*)|("[^"]+")' 

trennt die Felder durch Kommas und behandelt die Fälle, in denen die Felder eingebettete Kommas enthalten können (siehe GNU awk-HandbuchDefinieren von Feldern nach Inhalt).

-vOFS=,

gibt an, dass das Komma das Trennzeichen für die Ausgabedatei ist ,.

'$5 == "\"10,00,000.0\"" { $5="\"10,000,000.0\""}; {print}'

Wenn die fünfte Spalte mit der Zeichenfolge „10,00,000.0“ übereinstimmt, ersetzen Sie sie durch „10,000,000.0“ und drucken Sie die Zeile.

verwandte Informationen