tentando executar a operação base62 no unix com mais de 25 dígitos em uma linha, mas awk tratando um valor padrão

0

Abaixo está o meu código:

#!/usr/bin/ksh
awk 'BEGIN {FS="|"; flag=0;}
{
x=$2
rem=int(x)%62
quo=int(x/62)
flag=0
while(quo>62)
{
sub_rem=int(quo)%62
quo=int(quo/62)
if(flag==0)
{
grp_rem=sub_rem
}
else
{
grp_rem=sub_rem","grp_rem
}
flag++
}
printf "%d|%d|%s,%s,%s\n",$1,$2,quo,grp_rem,rem >> "text.out"
}
end{}
' test.txt

O problema com o código acima é:

1) ao tentar passar a entrada com mais de 18 ou mais, tendo um valor padrão

Sample data: 
1|123456789123456789123456789
2|24536789215457896314563

2) Depois de fazer a operação base62 para certas linhas, a saída é diferente para outras.

sample data: 
row1:  1|276
row2:  1|276
row3:  1|277
row4:  1|278
.
.
.
.
row 300: 300|276


samplet out: 
row1:  1|276|4,0,28
row1:  1|276|4,0,28
row1:  1|277|4,0,27
row1:  1|278|4,0,28
...
row 300: 300|276|4,1,28

Existe alguma maneira de resolver os problemas acima?

    
por siva10442 14.08.2018 / 07:06

1 resposta

1

Você está atingindo a precisão de awk inteiro.

Dado seu arquivo de entrada:

$ cat file
1|123456789123456789123456789
2|24536789215457896314563

Um simples print não está mostrando o resultado correto:

$ awk -F\| '{print $2+0}' file
123456789123456791337762816
24536789215457895776256

Um passo adiante é usar a opção --bignum ou -M :

$ awk --bignum -F\| '{print $2+0}' file
123456789123456789123456789
24536789215457896314563

Note que a opção --bignum está disponível no GNU awk versão 4.1.0.

    
por 14.08.2018 / 08:05

Tags