Tengo un archivo csv con un campo que tiene datos entre " " y comas en el medio. quiero reemplazarlo por otro

Tengo un archivo csv con un campo que tiene datos entre " " y comas en el medio. quiero reemplazarlo por otro

A continuación se muestran las primeras 5 líneas de mi archivo. Aquí, quiero reemplazar el "10.00.000,0" de la quinta columna por "10.000.000,0".

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"

Respuesta1

Al cambiar temporalmente el delimitador CSV a @(o cualquier otro carácter que aún no sea parte de los datos) usando csvformatdesdecsvkit, luego cambiando las cadenas relevantes en el quinto campo con awky devolviendo el delimitador a la coma original:

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

Con sus datos en data.csv, esto produce:

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"

Respuesta2

Podrías hacer esto con el siguiente sedcomando:

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

Respuesta3

¿Seguro que "20.00.000,0" es correcto? Si no, intenta

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

Agregue sla gbandera si se deben corregir todos los números incorrectos...

Respuesta4

Con GNUawk

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

Pruebas

$ 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"

Explicación

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

separa los campos por comas, manejando los casos en los que los campos pueden contener comas incrustadas (consulte el manual de GNU awkDefinición de campos por contenido).

-vOFS=,

indica que el separador del archivo de salida es la coma ,.

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

si la quinta columna coincide con la cadena "10.00.000,0", sustitúyala por "10.000.000,0"; imprimir la línea.

información relacionada