文件a.txt内容如下:
[root@localhost ~]# cat a.txt
a 10ms 20ms
b 5ms 40ms
c 34ms 8ms
找第二列最小的值,则代码:
[root@localhost ~]# cat a.txt |awk '
> BEGIN{
> minValue=1000
> }
> {
> v = $2;
> gsub(/ms/,"",v);
> minValue = minValue < v ? minValue : v;
> }
> END{
> print "====================";
> print "minValue:",minValue;
> }'
====================
minValue: 10
上面代码输出的最小值是10,使用gsub处理后的数据,比较大小不准确了 ???
把使用内置函数gsub删除"ms"的方式修改为使用内置函数split来处理,如:
[root@localhost ~]# cat a.txt |awk '
> BEGIN{
> minValue=1000
> }
> {
> v = $2;
> split(v,a,"ms");
> v=a[1];
> minValue = minValue < v ? minValue : v;
> }
> END{
> print "====================";
> print "minValue:",minValue
> }'
====================
minValue: 5
使用split进行字符的处理,能得到预期的结果。
执着于gsub为什么不行,进行了print分析:
[root@localhost ~]# cat a.txt |awk '
> BEGIN{
> minValue=1000
> }
> {
> v = $2;
> print "before gsub, value:"v"#";
> gsub(/ms/,"",v);
> print "after gsub, value:"v"#";
> minValue = minValue < v ? minValue : v;
> }
> END{
> print "====================";
> print "minValue:",minValue;
> }'
before gsub, value:10ms#
after gsub, value:10#
before gsub, value:5ms #
after gsub, value:5 #
before gsub, value:34ms#
after gsub, value:34#
====================
minValue: 10
显然a.txt的第二行的第二个字段除了包含"5ms"之外,在其末尾还有个特殊的空字符。
看来这个特殊的空字符不在awk模块的分割字符中,导致a.txt的第二行的第二个字段包含了空字符。