Eu tenho um arquivo csv com um campo com dados entre "" e vírgulas entre eles. Quero substituí-lo por outro

Eu tenho um arquivo csv com um campo com dados entre "" e vírgulas entre eles. Quero substituí-lo por outro

Abaixo estão as primeiras 5 linhas do meu arquivo. Aqui, quero substituir "10.00.000,0" da 5ª coluna 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"

Responder1

Alterando temporariamente o delimitador CSV para a @(ou qualquer outro caractere que ainda não faça parte dos dados) usando csvformatfromcsvkit, alterando as strings relevantes no quinto campo com awke retornando o delimitador para a vírgula original:

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

Com seus dados em data.csv, isso produz:

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"

Responder2

Você poderia fazer isso com o seguinte sedcomando:

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

Responder3

Tem certeza de que "20.00.000,0" está correto? Se não, tente

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

Adicione so gsinalizador de se todos os números errados devem ser curados ...

Responder4

Com GNUawk

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

Testes

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

Explicação

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

separa os campos por vírgulas, tratando dos casos em que os campos possam conter vírgulas incorporadas (veja o manual do GNU awkDefinição de campos por conteúdo).

-vOFS=,

afirma que o separador do arquivo de saída é a vírgula ,.

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

se a quinta coluna corresponder à string "10.00.000,0" substitua-a por "10.000.000,0"; imprima a linha.

informação relacionada