У меня есть файл csv с полем, содержащим данные, заключенные в " " и запятые между ними. Я хочу заменить его другим

У меня есть файл csv с полем, содержащим данные, заключенные в " " и запятые между ними. Я хочу заменить его другим

Ниже приведены первые 5 строк моего файла. Здесь я хочу заменить "10,00,000.0" 5-го столбца на "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"

решение1

Временно изменив разделитель CSV на @(или любой другой символ, который еще не является частью данных), используя csvformatfromcsvkit, затем меняем соответствующие строки в 5-м поле на awkи возвращаем разделитель к исходной запятой:

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

С вашими данными в data.csvэто приводит к следующему:

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"

решение2

Это можно сделать с помощью следующей sedкоманды:

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

решение3

Уверены, что "20,00,000.0" правильно? Если нет, попробуйте

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

Добавьте sфлаг g, если все неверные числа следует исправить...

решение4

С GNUawk

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

Тесты

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

Объяснение

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

разделяет поля запятыми, обрабатывая случаи, когда поля могут содержать встроенные запятые (см. руководство GNU awkОпределение полей по содержанию).

-vOFS=,

утверждает, что разделителем выходного файла является запятая ,.

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

если пятый столбец соответствует строке «10,00,000.0», замените ее на «10,000,000.0»; выведите строку.

Связанный контент