
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 YR
e 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 -pe
significado "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 /g
sinalizador para "global" (corresponde a todas as ocorrências na linha) e /e
que 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 YR
e 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,