awk 使用杂项

----------------------------------------
awk {}使用
----------------------------------------
例子:
$ echo "a-b-c" | awk '{gsub(/-/,"_",$0)}'
竟然什么都没有输出,而
echo "a-b-c" | awk 'gsub(/-/,"_",$0)'
可以输出正确的结果,
a_b_c
用大括号怎样才能输出期望的结果呢?
echo "a-b-c" | awk '{gsub(/-/,"_",$0);print $0}'
a_b_c
于是明白,语句块{}内,没有print 语句,是不会向屏幕输出的.
而不带大括号的那种用法是不多见的,因为我们往往对变量要进行复杂变换,然后才输出.

----------------------------------------
awk 输入16进制数
----------------------------------------
awk 内部是支持16进制输入的, 如下示例.
$ echo|awk '{printf "%d\n",0x100 }'
256

但直接从外部输入16进制数据则不行.
示例:
$ echo 0x100|awk '{printf "%d\n", $1}'
0
解决办法有2种
1. 让awk 支持16进制输入, 这需要给awk 输入一个-n 选项
用法示例:
$ echo 0x100|awk -n '{printf "%d\n", $1}'
256

-n 的意思是告诉awk 输入的字符串不是10进制数据.


2. 用strtonum函数把输入项从字符串转换为整数
$ echo 0x100|awk '{printf "%d\n",strtonum($1) }'
256
 

----------------------------------------
awk 怎样将字符变成数字
----------------------------------------
awk 中, 数字可以当字符打印, 例如 $ echo|awk '{printf "%c",97}' 会打印a
    但反之不行. $ echo|awk '{printf "%d", "a"}' 输出会是0
awk 中, %d 是将数字型字符串变成对应的数字,这个容易理解. 例如"1234"
但它不能将字符变成数字,因为它没有字符的概念,'A'是不能使用的,目前我只知道'引住执行代码'{}'
双引号引住的算字符串, 非数字的东西都被认为是0, (好在现在还能支持16进制和8进制输入转换)

那如果一定要将字符变成整数该怎么办呢? 例如输入一个字符想打印它的ascii值, 那要用变通的办法.
怎么变通?
造一个hash表, 让这个表的key值是字符, 让这个表的value是该key的ascii, 这就是著名的ORD表.
当你输入一个字符时,查询该map 的value值, 就可以按值打印了.
代码如下:
$echo a|awk 'BEGIN{for(i=0;i<=127;i++)ord[sprintf("%c",i)]=i} {print ord[$1]}'
97
或者用printf, 用%d明确指出打印的变量是个数值.
$echo a|awk 'BEGIN{for(i=0;i<=127;i++)ord[sprintf("%c",i)]=i} {printf "%d", ord[$1]}'
97

好在sprintf 能够把整数变成字符,否则就坏菜了(没法办了), 可见awk还是给我们留了一条路.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值