awk adicione um valor ao campo

awk adicione um valor ao campo

Estou procurando uma ideia sobre como adicionar um valor a um campo, meu arquivo fica assim:

line(001)=YR200PR1030,YR230PR1580,YR340PR2016,
          YR450PR2450,
          PRF3500,
line(002)=YR200PR452,YR230PR740,YR340PR1500,
          YR450PR2120,
          PRF2800,

e quero adicionar um valor de 32 a cada valor entre YR e PR , então ex:
YR200PR1030-->YR232PR1030

qualquer ideia? obrigado.

Responder1

Se o que você precisa é incrementar o valor numérico encontrado entre cada ocorrência de YRe PR, você pode tentar:

$ perl -pe 's/YR(\d+)PR/sprintf("YR%sPR",$1 + 32)/eg' file
line(001)=YR232PR1030,YR262PR1580,YR372PR2016,
          YR482PR2450,
          PRF3500,
line(002)=YR232PR452,YR262PR740,YR372PR1500,
          YR482PR2120,
          PRF2800,

Ou, para editar o arquivo no local:

perl -i -pe 's/YR(\d+)PR/sprintf("YR%sPR",$1 + 32)/eg' file

O -pesignificado "print cada linha após aplicar o script fornecido por -e". O script em si é apenas um operador de substituição ( s/old/new/) com o /gsinalizador para "global" (corresponde a todas as ocorrências na linha) e /eque nos permite executar o código na mão direita lado do operador Por fim, o regex corresponderá a um ou mais dígitos ( \d+) entre a YRe a PR, capturando os dígitos como $1, e então a substituição imprimirá YR, o número capturado mais 32 e PR.

Responder2

Usando qualquer awk em qualquer shell em cada caixa UNIX:

$ cat tst.awk
{
    while ( match($0,/YR[0-9]+PR/) ) {
        printf "%s%d", substr($0,1,RSTART+1), substr($0,RSTART+2)+32
        $0 = substr($0,RSTART+RLENGTH-2)
    }
    print
}

.

$ awk -f tst.awk file
line(001)=YR232PR1030,YR262PR1580,YR372PR2016,
          YR482PR2450,
          PRF3500,
line(002)=YR232PR452,YR262PR740,YR372PR1500,
          YR482PR2120,
          PRF2800,

Responder3

Comando

for ((j=1;j<=2;j++)); do awk -v j="$j" -F "," 'NR==j && ORS=","{for(i=1;i<=NF;i++){if ($i ~ /^YR[0-9]*PR[0-9]*/){print substr($i,1,2)substr($i,3,3)+32substr($i,6)}else {print $i}}}' p.txt; echo -e "\n"; done

saída

YR232PR1030,YR262PR1580,YR372PR2016,YR482PR2450,

YR232PR452,YR262PR740,YR372PR1500,YR482PR2120,PRF2800,

informação relacionada