【zz】从文本中提取出数字进行运算-使用awk

本文从我的博客空间转发(http://my.unix-center.net/~xiaoshe):

http://my.unix-center.net/~xiaoshe/2010/04/01/%E4%BB%8E%E6%96%87%E6%9C%AC%E4%B8%AD%E6%8F%90%E5%8F%96%E5%87%BA%E6%95%B0%E5%AD%97%E8%BF%9B%E8%A1%8C%E8%BF%90%E7%AE%97-%E4%BD%BF%E7%94%A8awk/

 

这是很多时候我们遇到的问题:
在一个文本文档中存放着我们需要的数据,很多是一些数字的数据,大小,长短,重量,价钱之类的数字.
注意,这时的数字是在文本文档中,就是存在类似.txt文档中的数字.为什么要注意呢,因为这时的数字虽然在我们的眼中是数字,但是在电脑的眼中,它其实 只是普通的字符串..而不是int类型…
我们对于这些存在文本文档中的数字想进行什么样的操作呢?
很自然的,既然是数字,我们肯定就会有需求做一些对数字的常见的处理,比如统计各个商品的平均值价格,统计总重量,统计最大的值,最小的值之类的数学操 作.
但是再想想,我们面对的所谓数字,其实并不是int类型的数据,拿起来就能用的,而是一个char[]数组….是不是有一种想崩溃的冲动呢??
或者,是不是想自己写个函数,来完成字符串到数字的转换,然后再接着对从字符串转化为int或者float类型的数字进行数学运算呢?
这么做可以么?当然可以了.不过有时候有时候只是偶尔处理一下这样的情况,就显得没有太大的必要.
那么有工具可以把直接能够识别文本中的数字么?
当然有的.用awk就可以了.
如果你还不知道awk的话,那么很有可能你的生活中确实就不需要知道和了解awk.
如果你知道和使用过awk,但是还不知道awk有把文本中的数字提取出来进行数学运算的功能的话,
那么你需要了解一下,awk确实有这么个很方便的功能!!!只是你一直没有注意到.
————————————————-
我注意到awk有这个功能是源于我的一个需求.我的一个需求是这样的,有下面的一个文本文档:
TR41761752_050927-19.43.59.TXT:Time delay DL: [-3 -9 -15 -12 -16 -16 -13 -12 -9 -6 -3 10]
TR41763227_050916-21.15.52.TXT:Time delay DL: [-3 -9 -15 -13 -12 -16 -15 -13 -15 -7 0 6]
TR41763227_050916-21.15.52.TXT:Time delay DL: [8 -5 -7 -12 -11 -8 -10 -10 -6 -6 1 10]
TR41764687_050823-08.53.48.TXT:Time delay DL: [2 -6 -10 -14 -13 -14 -16 -13 -9 -6 -5 5]
TR41764687_050823-08.53.48.TXT:Time delay DL: [2 -5 -9 -13 -15 -11 -11 -16 -14 -11 -2 7]
TR41765622_050916-20.24.10.TXT:Time delay DL: [6 -2 -8 -8 -13 -10 -13 -13 -12 -9 0 6]
TR41765622_050916-20.24.10.TXT:Time delay DL: [2 -5 -11 -13 -11 -14 -8 -11 -11 -7 0 4]
—————————————————
对于上面的这个文档,每一行有12个数值,我的需求是对于所有行中的这12列的数据,每一列都取一个平均值.
这个需求相当的自然和简单,处理的方法也可以很简单,直接拿一个计算器按一按就能够把12个平均值都算出来.
但是如果这个文件有一千行,有一万行,而且每个数据都是长长的小数的时候,工作量可想而知….
那么,awk又是如何处理的呢?
我们知道,在awk中,最小的能够处理的单元是一行中的一个”cell”,如果了解awk的话,这个概念不难理解.每个cell都有一个像变量一样 的$n($1,$2,$3…)来存放其值.当然,这些cell都是一些字符组成的字符段.
awk的神奇之处在于,如果在这个cell中全部都是由数字组成的话,就如上面文件中的”-13″,”7″,”2″或者如”345.1987″等等这样 由”数字字符串”构成的话,那么我们可以把这个cell当作字符串来进行字符串的操作,比如打印,字符串连接等等,也可以把这个cell当成数字来进行数 学运算!!!这时的$n就相当于一个变量一般,能够进行诸如$1+1,$1>1,$1*12这样的操作!!!
是不是很神奇??
awk就是这么神奇!!
就是这么简单!!!
所以对于我的上面的这个需求,实际的处理的awk命令就变成了下面的这样:
awk -F[ '{print $2}' | awk -F] ‘{print $1}’ | /
awk ‘BEGIN{value1=value2=value3=value4=value5=value6=value7=value8=value9=value10=value11=value12=0;}/
{value1+=$1;value2+=$2;value3+=$3;value4+=$4;value5+=$5;value6+=$6;value7+=$7;value9+=$8;/
value9+=$9;value10+=$10;value11+=$11;value12+=$12;}/
END{print “==================”;/
print “average values:”;/
print value1,value2,value3,value4,value5,value6,value7,value8,value9,value10,value11,value12;/
}’

上面的命令中,就利用了awk的这一特性,将字符串作为数值赋值给变量:value1+=$1;
神奇而又简单.
知道了awk的这个特性之后,相信你的文本处理的能力又有了一个实质上的提高,且对awk的喜爱也更加的多了一分.

参考链接:http://my.unix-center.net/~xiaoshe/2009/11/03/%E5%85%B3%E4%BA%8Eawk/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值