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

Dhr*_*uuv 3 linux awk csv replace

我想通过查找特定字符串来替换 .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
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下 awk 但不起作用:

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

hee*_*ayl 6

您需要正确设置字段分隔符 ( 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
Run Code Online (Sandbox Code Playgroud)
  • -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
Run Code Online (Sandbox Code Playgroud)