AWK / GAWK adicionando caractere após o padrão ser correspondido

2

Eu tenho a seguinte estrutura de dados no meu arquivo de teste:

"111","222","AAABBB","333","444","555"

Eu quero transformar o terceiro campo para que haja um '-' depois do terceiro [A-Z] assim:

"111","222","AAA-BBB","333","444","555"

Está usando a função split () a melhor ferramenta para este trabalho? Aqui está o que eu tentei:

awk 'BEGIN{OFS=FS=","} {split($3, a, "[A-Z]{3}", seps); print seps[1]"/"seps[2]};' test

O comando acima faz o que eu quero, mas como posso imprimir a linha inteira incluindo meu campo $ 3 atualizado? Resultado:

AAA-BBB
    
por GustavMahler 01.03.2018 / 19:34

3 respostas

5

Solução awk curta:

awk 'BEGIN{ OFS=FS="," }{ sub(/[A-Z]{3}/, "&-", $3) }1' file
  • [A-Z]{3} - padrão de regex para corresponder a três letras maiúsculas
  • & - representa a substring precisa que foi correspondida pelo padrão regexp

A saída:

"111","222","AAA-BBB","333","444","555"
    
por 01.03.2018 / 19:40
3

Em awk , quando você reatribui o valor de uma variável de campo, o valor de $0 é recalculado:

$ echo "A B C" | awk '{ $2 = "two"; print $0 }'
A two C

Então, no seu caso:

awk 'BEGIN{OFS=FS=","} {split($3, a, "[A-Z]{3}", seps); $3 = seps[1]"-"seps[2]; print $0}' test
    
por 01.03.2018 / 19:39
3

Sua descrição da lógica desejada não é 100% clara, mas o seguinte comando Sed funciona na sua entrada de exemplo:

sed 's/[A-Z]/&-/3' test-file.txt
    
por 01.03.2018 / 20:51