Substitua uma string em uma coluna do arquivo CSV por outra com uma aspa simples

2

Eu gostaria de substituir o conteúdo da terceira coluna de um arquivo .CSV (usando awk) procurando por uma string específica e substituir por outra string que tenha uma aspa única e copie a saída dela em outro arquivo. Algum conselho sobre o que estou fazendo errado?

Por exemplo:

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

Eu tentei usar o awk abaixo, mas não funciona:

awk '{gsub("SAMS CLUB","SAM\'S CLUB",$3);print}' filename1 > filename2
    
por Dhruuv 30.08.2017 / 03:42

3 respostas

5

Você precisa definir o separador de campo ( FS ) corretamente. Por padrão, awk usa qualquer espaço em branco horizontal como o separador de campo, portanto, no seu caso, SAMS se torna um campo e CLUB se torna outro. Portanto, {gsub("SAMS CLUB","SAM\'S CLUB",$3);print} não está funcionando como esperado.

Você pode fazer:

awk -F ', +' '{gsub("SAMS CLUB","SAM'\''S CLUB",$3); print}' OFS=", " file.txt
  • -F ', +' define FS como vírgula, seguido por um ou mais espaços. Se você não tiver certeza sobre os espaços, use a classe de caractere [:blank:] para representar qualquer espaço em branco horizontal e altere OFS para atender sua necessidade também.

Exemplo:

% 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
    
por 30.08.2017 / 03:58
2
awk -F, '{gsub("SAMS CLUB","SAM'\''S CLUB",$3);print}' filename1 > filename2

Você estava perto - faltando apenas duas peças:

  1. informando ao awk para dividir a entrada em campos com base em vírgulas ( -F, ) e
  2. obtendo a cotação única no texto de substituição

Como o script awk é cercado por aspas simples, uma maneira de fazê-lo é terminar o texto entre aspas simples, inserir uma aspas simples (com escape) e continuar com o texto entre aspas simples. Outra maneira é usar variáveis:

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

No entanto, outra maneira seria usar a variável ENVIRON array.

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

Ainda outro seria salvar o awk-script em um arquivo e chamá-lo com:

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

Usar um arquivo de script permitiria simplificar as citações:

{gsub("SAMS CLUB","SAM'S CLUB",$3);print}
    
por 30.08.2017 / 03:56
0

Outra solução awk curta:

awk -F, '$3~"SAMS CLUB"{sub("S ","7S ",$3)}1' OFS=',' filename1 > filename2
    
por 30.08.2017 / 07:08