Chinaunix首页 | 论坛 | 博客
  • 博客访问: 841794
  • 博文数量: 372
  • 博客积分: 10063
  • 博客等级: 中将
  • 技术积分: 4220
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-24 11:36
文章分类

全部博文(372)

文章存档

2012年(372)

分类: 云计算

2012-02-25 12:29:29

from:http://blog.chinaunix.net/uid-10540984-id-2889218.html

十六进制转十进制:

  1. echo '12af' | awk '{print strtonum("0x"$0)}'
  2. 4783

十进制转十六进制:
  1. echo "4783"|awk '{printf("%x\n",$0)}'
  2. 12af

八进制转十进制:
  1. echo '011257' | awk '{print strtonum($0)}'
  2. 4783

十进制转八进制:
  1. echo "4783"|awk '{printf("%o\n",$0)}'
  2. 11257

strtonum(str) : Examines str, and returns its numeric value. If str begins with a leading 0, strtonum() assumes that str is an octal number. If str begins with a leading 0x or 0X, strtonum() assumes that str is a hexadecimal number.

strtonum()函数把0开头的当作八进制,把0x或0X开头的当作16进制返回它们的数值.它还有一个功能,能截取一个字段里数字开头的并包含有其他非数字字符的字符串中的数字,有点饶口吧,举个栗子:
  1. $ cat file
  2. 555 a ;
  3. 123c
  4. c123
  5. $ awk '{print "\""strtonum($0)"\""}' file # 其实就是 print $0+0 的变体,注意遇到第一个非数字就判断后面的全为非数字
  6. "555"
  7. "123"
  8. "0"

如果有些字段里包含空格啊,其他一些非数字字符等,可以用它来去掉。

——————————————————————————————————————————————

注:

1、再举两个sprintf与十六进制和十进制相互转换的例子:

june@~ 02:46:13>
echo "134224939 134225061 134225342 134225407 134225494 134225539 134225542 134225545 134225548 134225596"|awk -vOFS="," 'NF+=0{for(i=1;i<=NF;i++){$i=sprintf("%x",$i)}print}'
8001c2b,8001ca5,8001dbe,8001dff,8001e56,8001e83,8001e86,8001e89,8001e8c,8001ebc

june@~ 02:52:12>
june@~ 02:52:12>
echo "8001ca5,8001dbe,8001e83,8001e86,8001e89,8001e8c,8001ebc,8001c2b,8001e56,8001dff"|awk -vFS="," -vOFS="," 'NF+=0{for(i=1;i<=NF;i++){$i=sprintf( "%s",strtonum("0x"$i))};print}'
134225061,134225342,134225539,134225542,134225545,134225548,134225596,134224939,134225494,134225407
june@~ 02:52:26>

2、python中有类似的函数做转换:

>>> print hex(134225061)
0x8001ca5
>>> print int(0x8001ca5)
134225061
>>>

阅读(1129) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~