- 论坛徽章:
- 0
|
本帖最后由 jils2013 于 2012-06-15 11:12 编辑
应该是sprintf()和类型转化的问题
因为转化类型为d,所以按照数字来处理;--我猜可能是处理的数字大小限制(或者长度限制)
改转化类型为s,即可避免开始的问题
以下是几个简化的测试- [root@localhost ~]# echo "" | awk '{print sprintf("%020s","100111101010111111");}'
- 00100111101010111111
- [root@localhost ~]# echo "" | awk '{print sprintf("%020d","100111101010111111");}'
- 00100111101010111104
- [root@localhost ~]# echo "" | awk '{print sprintf("%020d","10011110101011111111");}'
- 10011110101011111936
- [root@localhost ~]# echo "" | awk '{print sprintf("%020s","10011110101011111111");}'
- 10011110101011111111
- [root@localhost ~]# echo "" | awk '{print sprintf("%030d","100111101010111111110");}'
- 00000000000000000001.00111e+20
- [root@localhost ~]# echo "" | awk '{print sprintf("%030s","100111101010111111110");}'
- 000000000100111101010111111110
复制代码 最开始问题的改进后- [root@localhost ~]# echo "" | awk 'function binary(num)
- {str="";while(num!=0){str=num%2str;num=int(num/2);};return sprintf("%02s",str)}
- END\
- {print binary(1624958878)}'
- 1100000110110101110011110011110
- [root@localhost ~]# echo "" | awk 'function binary(num)
- {str="";while(num!=0){str=num%2str;num=int(num/2);};return sprintf("%02s",str)}
- END\
- {print binary(162495)}'
- 100111101010111111
复制代码 所以,问题的结论个人认为应该是awk处理数字的精度问题,这也可以解释,最开始的问题:处理小数字没有问题,处理大数字时缺出现问题;
sprintf()d的解释:
d, i 接受整数值并将它转换为有符号的十进制符号表示法。精度指定显示的最小数字位数。如果值转换后可以用更少的位数来表示,将使用前导零扩展。缺省精度是 1。精度为零的零值转换的结果是空字符串。用零作为前导字符来指定字段宽度,导致用前导零填充字段宽度值。
也就是说,我们把一个2进制20多位的数字字符串传递给sprintf时,他会按照这个数字时十进制去处理,应该是很大的数字了
-- 开始的问题
前几天用 awk 的 一个十进制和二进制转换的自定以的函数,较小的数字没有问题;
数字大点的,就会莫名其妙的打印问题:用print 加变量可以正常打印,但是如果直接print 加上函数执行 打印的数字和正常的小一点;
平台是rhel 5.4- [root@localhost shell]# awk --version
- GNU Awk 3.1.5
- [root@localhost shell]# echo "" | awk 'function binary(num)
- {str="";while(num!=0){str=num%2str;num=int(num/2);};return sprintf("%0d",str)}
- END\
- {binary(162495);print str}'
- 100111101010111111
- [root@localhost shell]# echo "" | awk 'function binary(num)
- {str="";while(num!=0){str=num%2str;num=int(num/2);};return sprintf("%0d",str)}
- END\
- {print binary(162495)}'
- 100111101010111104
- [root@localhost shell]# echo "" | awk 'function binary(num)
- {str="";while(num!=0){str=num%2str;num=int(num/2);};return sprintf("%0d",str)}
- END\
- {print binary(16249)}'
- 11111101111001
复制代码 |
|