Заменить строку в столбце файла CSV другой строкой с одинарной кавычкой

Нет, извините, но архитектура i686 только 32-битная. А amd64 - это 64-битный программный iso. Изображение не повреждено, машина просто не может его прочитать.

2
30.08.2017, 04:42
3 ответа
awk -F, '{gsub("SAMS CLUB","SAM'\''S CLUB",$3);print}' filename1 > filename2

Ты был близок --просто не хватило двух частей:

  1. указание awk разделить ввод на поля на основе запятых(-F,
  2. получение одинарной -кавычки в замещающем тексте

Поскольку скрипт awk заключен в одинарные -кавычки, один из способов сделать это — закончить текст в одинарных -кавычках, вставить одинарную (экранированную )кавычку, а затем возобновить одинарную -] цитируемый текст. Другой способ — использовать переменные :

.
awk -F, -v old="SAMS CLUB" -v new="SAM'S CLUB" '{gsub(old,new,$3);print}' filename1 > filename2

Еще один способ — использовать переменную массива ENVIRON.

old="SAMS CLUB"
new="SAM'S CLUB"
export old new
awk -F, '{gsub(ENVIRON["old"], ENVIRON["new"], $3);print}'  

Еще один вариант — сохранить сценарий awk -в файл и вызвать его с помощью:

awk -F, -f awk-script-filename filename1 > filename2

Использование файла сценария позволит вам упростить цитирование:

{gsub("SAMS CLUB","SAM'S CLUB",$3);print}
2
27.01.2020, 21:52

Необходимо правильно установить разделитель полей (FS). По умолчанию awkиспользует любой горизонтальный пробел (s )в качестве разделителя полей, поэтому в вашем случае SAMSстановится одним полем, а CLUBстановится другим. Следовательно, {gsub("SAMS CLUB","SAM\'S CLUB",$3);print}не работает должным образом.

Вы можете:

awk -F ', +' '{gsub("SAMS CLUB","SAM'\''S CLUB",$3); print}' OFS=", " file.txt
  • -F ', +'задает FSкак запятую, за которой следует один или несколько пробелов (s ). Если вы не уверены в пробелах, вместо этого используйте класс символов [:blank:]для представления любых горизонтальных пробелов и измените OFSв соответствии с вашими потребностями.

Пример:

% cat file.txt                                                                      
column1, coluumn2, coulumn3, column4, column5
1, item1, WALMART, 2.39, 50
2, item2, TARGET, 4.99, 52
3, item3, SAMS CLUB, 8.19, 15
4, item4, KROGER, 12.49, 33
5, item6, WEGMANS, 32.69, 75
6, item6, TARGET, 12.99, 25
7, item7, SAMS CLUB, 8.19, 92

% awk -F ',[[:blank:]]+' '{gsub("SAMS CLUB","SAM'\''S CLUB",$3); print}' OFS=", " file.txt
column1, coluumn2, coulumn3, column4, column5
1, item1, WALMART, 2.39, 50
2, item2, TARGET, 4.99, 52
3, item3, SAM'S CLUB, 8.19, 15
4, item4, KROGER, 12.49, 33
5, item6, WEGMANS, 32.69, 75
6, item6, TARGET, 12.99, 25
7, item7, SAM'S CLUB, 8.19, 92
6
27.01.2020, 21:52

Другое короткое awk решение:

awk -F, '$3~"SAMS CLUB"{sub("S ","\047S ",$3)}1' OFS=',' filename1 > filename2
0
27.01.2020, 21:52

Теги

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