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 csvformat
fromcsvkit
, anschließend im 5. Feld die entsprechenden Strings durch ersetzen awk
und 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.csv
ergibt 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 s
die g
Flagge 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.