我想通过查找特定字符串来替换 .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
你已经很接近了——只是缺少两块:
- 告诉 awk 将输入拆分为基于逗号 (
-F,
) 的字段,以及 - 将单引号放入替换文本中
由于 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