![尝试在unix中执行连续超过25位数字的base62操作,但awk处理默认值](https://linux22.com/image/138532/%E5%B0%9D%E8%AF%95%E5%9C%A8unix%E4%B8%AD%E6%89%A7%E8%A1%8C%E8%BF%9E%E7%BB%AD%E8%B6%85%E8%BF%8725%E4%BD%8D%E6%95%B0%E5%AD%97%E7%9A%84base62%E6%93%8D%E4%BD%9C%EF%BC%8C%E4%BD%86awk%E5%A4%84%E7%90%86%E9%BB%98%E8%AE%A4%E5%80%BC.png)
下面是我的代码:
#!/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
上述代码的问题是:
1) 当尝试传递超过 18 或更多的输入时采用默认值
Sample data:
1|123456789123456789123456789
2|24536789215457896314563
2)对某些行进行base62操作后,其他行的输出不同。
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
有什么办法可以解决上述问题吗?
答案1
您正在达到awk
整数精度。
给定您的输入文件:
$ cat file
1|123456789123456789123456789
2|24536789215457896314563
一个简单的方法print
没有显示正确的结果:
$ awk -F\| '{print $2+0}' file
123456789123456791337762816
24536789215457895776256
前进的方法是使用选项--bignum
或-M
:
$ awk --bignum -F\| '{print $2+0}' file
123456789123456789123456789
24536789215457896314563
请注意,该选项--bignum
从 GNU awk 版本 4.1.0 起可用。