Eu tenho um arquivo delimitado por pipe
d1000|1000
d1001|100
d1002|10
d1003|1
d1004|
d1005|
Eu quero modificar $ 2 se o comprimento for menor que 4 dígitos e também manter os espaços vazios como estão
então tentando fazer isso via script awk
BEGIN { FS="|"; OFS="\t" }
{
n=1100
{ if (length($2)!=4 && length($2)>0) {$2=++n}};
print $1, $2
}
mas está imprimindo o mesmo número repetidamente
d1000 1000
d1001 1101
d1002 1101
d1003 1101
d1004
d1005
enquanto a saída desejada
d1000 1000
d1001 1101
d1002 1102
d1003 1103
d1004
d1005
EDIT: aqui está o código acima formatado de forma legível por gawk -o-
:
BEGIN {
FS = "|"
OFS = "\t"
}
{
n = 1100
if (length($2) != 4 && length($2) > 0) {
$2 = ++n
}
print $1, $2
}
O erro pode ser óbvio com recuo mais consistente:
Tudo dentro das chaves externas é executado, incondicionalmente, para cada registro - então o valor de
n
é redefinido a cada linha.Você deve mover a inicialização de
n
para oBEGIN
bloco:ou (mais idiomaticamente)
Proponho esta solução: