将 CSV 文件列中的字符串替换为另一个带单引号的字符串

将 CSV 文件列中的字符串替换为另一个带单引号的字符串

我想通过查找特定字符串来替换 .CSV 文件第三列的内容(使用 awk),并替换为具有单引号的另一个字符串,并将其输出复制到另一个文件中。对我做错了什么有什么建议吗?

例如:

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 但不起作用:

awk '{gsub("SAMS CLUB","SAM\'S CLUB",$3);print}' filename1 > filename2

答案1

您需要FS正确设置字段分隔符( )。默认情况下,awk使用任何水平空格作为字段分隔符,因此在您的情况下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为逗号,后跟一个或多个空格。如果您不确定空格,请使用字符类[: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

答案2

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}

答案3

又一个短篇awk解决方案:

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

相关内容