您的位置:首页 > 其它

awk读取输入数字时对进制的判断问题

2010-07-26 17:35 211 查看
考虑以下需求,用awk获取数值范围内的文件:

[root@rac0 testls]# touch 0405.log  0406.log  0623.log  0624.log  0625.log  0724.log  0725.log  0726.log
[root@rac0 testls]# ls -l
总计 32
-rw-r--r-- 1 root root 0 07-25 18:39 0405.log
-rw-r--r-- 1 root root 0 07-25 18:39 0406.log
-rw-r--r-- 1 root root 0 07-25 18:39 0623.log
-rw-r--r-- 1 root root 0 07-25 18:39 0624.log
-rw-r--r-- 1 root root 0 07-25 18:39 0625.log
-rw-r--r-- 1 root root 0 07-25 18:39 0724.log
-rw-r--r-- 1 root root 0 07-25 18:39 0725.log
-rw-r--r-- 1 root root 0 07-25 18:39 0726.log
[root@rac0 testls]# ls |awk -F'[.]' '$1 >0624 && $1<0725'
0405.log
0406.log


结果出错了?问题出在哪里呵

在不理解的情况下,有人试用了双引号:

[root@rac0 testls]# ls |awk -F'[.]' '$1 >"0624" && $1<"0725"'
0625.log
0724.log


结果正确。

考虑下$1的实际数值:

[root@rac0 testls]# ls |awk -F'[.]' '{print $1,$1-624}'
0405 -219
0406 -218
0623 -1
0624 0
0625 1
0724 100
0725 101
0726 102
[root@rac0 testls]# ls |awk -F'[.]' '{print $1,$1-0624}'
0405 1
0406 2
0623 219
0624 220
0625 221
0724 320
0725 321
0726 322


说明,这边$1读进去是十进制,读进0405,是十进制405,

而表达式里的0624,实际上是解释成八进制,值是404
所以才有这样的结果

如何让输入接入八进制和十六进制?
看看gnu awk的man有这句:
--non-decimal-data
Recognize octal and hexadecimal values in input data. Use this option with great caution!

再看看加不加的区别

[root@rac0 testls]# ls |awk --non-decimal-data -F'[.]' '{print $1,$1-0624}'
0405 -143
0406 -142
0623 -1
0624 0
0625 1
0724 64
0725 65
0726 66
16:28:05 -388
Elapsed -404
[root@rac0 testls]# ls |awk  -F'[.]' '{print $1,$1-0624}'
0405 1
0406 2
0623 219
0624 220
0625 221
0724 320
0725 321
0726 322


默认情况下是按十进制输入的

加个参数就可以支持八进制和十六进制了

不过还是要分析好数据,以防不慎

另外,加双引号也是可以的,不过

,只不过转化成按字符比较了,

不过用字符问题,是
"12"比"2"小

[root@rac0 testls]# awk 'BEGIN{a=12>2?0:1; print a;}'
0
[root@rac0 testls]# awk 'BEGIN{a="12">"2"?0:1; print a;}'
1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐