Como imprimir o delimitador correto ao usar uma expressão regex como delimitador?

4

Eu tenho linhas parecidas com esta

123-456-789 12.34.56 example

Eu quero selecionar o 12, adicionar 2 a ele e imprimir a linha inteira como está. Então o resultado deveria ser:

123-456-789 14.34.56 example

Eu tenho essa expressão estranha:

awk 'BEGIN {FS="[ .]"}{$2=$2+2}{print}'

Mas isso me dá

123-456-789 14 34 56 example

Os pontos desapareceram e foram substituídos por espaços.

    
por lbstis 24.05.2018 / 14:43

4 respostas

0

Tentando " restaurar " um separador de campo complexo / composto provavelmente quebrará alguns valores e a consistência de todo o registro.
Em vez disso, use a seguinte abordagem:

awk '{ n = substr($2, 1, index($2, ".")); sub(/[^.]+\./, n + 2 ".", $2) }1' file

A saída:

123-456-789 14.34.56 example

O comando acima usará espaço (s) branco (ais) como separador de campo padrão e executará todo o processamento necessário no 2º campo $2 apenas.

    
por 24.05.2018 / 15:50
1
awk '{ split($2,a,"\."); a[1]+=2; $2=sprintf("%d.%d.%d", a[1],a[2],a[3]) } 1' file

Alternativamente,

awk '{ split($2,a,"\."); $2=sprintf("%d.%d.%d", a[1] + 2,a[2],a[3]) } 1' file

Isto lê a linha como um conjunto de campos separados por espaços em branco. Divide o segundo campo em pontos e adiciona 2 à primeira parte do resultado. Em seguida, ele re-forma o segundo campo como três inteiros delimitados por ponto antes de imprimir o registro resultante (a impressão é feita pelo 1 no final, que é uma maneira de dizer { print } ).

Isso pressupõe que sabemos que o segundo registro é de fato três inteiros delimitados por pontos.

Eu faria assim, pois é bastante explícito no que acontece e, portanto, é fácil de entender e manter.

    
por 24.05.2018 / 17:10
0

Use a função split no seu script awk que permite capturar o separador de campo:

 awk '{split($0,a,"[- .]",sep); a[4]+=2; for(i in a) printf "%s%s",a[i], sep[i]; printf "\n"}' file

Como alternativa, você pode usar as variáveis RS e RT

 awk -v RS='[- .]' 'NR==4{$1+=2} {printf "%s%s",$0,RT}' file <<< '123-456-789 12.34.56 example'

Observe que o último trabalho só funcionaria para uma única linha.

    
por 24.05.2018 / 16:09
0

Com o gawk para o gensub

gawk '{sub(/[^.]*/,gensub(/([^.]*).*/,"\1",1,$2)+2,$2)}1' infile
    
por 24.05.2018 / 16:52