awk Поиск и замените строку в определенный столбец файла CSV

Переменные Bash обрабатываются как символьные строки, если не введены. Я бы начал с попытки объявить тип для ваших переменных. Что-то вроде этого,

declare -i var1

Я не оптимистичен, что это объявление типа будет для вас решением, но его стоит попробовать.

Если это не сработает, почему бы не изменить параметры вашей функции на символьную строку вместо числовых значений? Позвольте вашему mfile обработать преобразование в числовой тип по вашему выбору.

Литература:

3
27.06.2018, 11:01
2 ответа
awk -F '|' -v OFS='|' '$16 == "Market1" { $16 = "MarketPrime" }1' file.csv >new-file.csv

Единственная реальная проблема в вашем коде заключается в том, что вы установили разделитель входного файла не только |, но и пробелы. Это приведет к тому, что пробелы будут считаться разделителями полей в данных, и будет невероятно сложно определить правильный номер поля (, поскольку некоторые поля содержат переменное количество пробелов ).

Вы также не можете перенаправить в файл с тем же именем, которое вы используете для чтения. Это заставит оболочку сначала обрезать (пустой )выходной файл, и ваша awkпрограмма не будет иметь данных для чтения.

Ваш код выполняет замену регулярного выражения. Это нормально, но вы должны знать, что если 16-е поле окажется чем-то вроде Market12или TheMarket1, это вызовет замену из-за отсутствия точек привязки. Было бы безопаснее использовать ^Market1$в качестве выражения для замены или использовать сравнение строк.

Приведенная выше команда awkиспользует только |в качестве разделителя полей, а затем выполняет сравнение строки с 16-м полем. Если это поле Market1, оно устанавливается на MarketPrime.

Конечный 1в конце кода awkприводит к печати каждой записи (, измененной или не измененной ).

10
27.01.2020, 21:09

Для ясности для тех, кто может столкнуться с похожими проблемами:

Оба эти ответа работали для этого сценария:

Ответ Кусалананды:

awk -F '|' -v OFS='|' '$16 == "Market1" { $16 = "MarketPrime" }1' file.csv >new-file.csv

Мой пересмотренный ответ, основанный на ответе Кусалананды:

awk -F '|' '{gsub("Market1","MarketPrime",$16); print}' OFS="|" marketinfo_2018-06-26.csv > marketinfo_2018-06-26.csv
0
27.01.2020, 21:09

Теги

Похожие вопросы