分类:
2009-01-15 18:58:08
工作中经常处理文本,以前经常接触db2数据库,最近在学习的过程中发现awk处理数据的强大,可谓无所不能!下面讲的就算awk对语句统计数据的模拟。
一、先讲讲sql的单表操作,对应awk的单处理。
测试环境:sco + db2,数据文件名file,数据库表名mytable,为保证准确性,所有语句均做测试。
就以存折明细这样的数据来举例吧,为了实现一些复杂的sql语句,数据有点多。
字段说明:1日期date 2摘要zy 3借贷标志bz 交易金额je 4余额ye 5操作员czy
|
|
sql语句:
|
|
awk语句:
|
|
2、统计07、08年各类交易发生的笔数、金额
sql语句:
|
|
awk语句:
|
|
3、嗯,在我的存折明细中,按月统计下07、08年每个操作员、每月的交易发生笔数吧,扣电费、电话费(czy为auto)的不统计,结果按月份、操作员号排序
sql语句:
|
|
awk语句:
|
|
对以上3个例子做个小总结:
awk如何实现sql语句的group分组功能呢?
关键是定义好数组,如:第1例中sql对月份(substr(date,1,6))分组,那awk中就定义数组a[substr($1,1,6)]。至于要给该数组赋怎样的值,看统计需求。如例1统计分组后的次数,就a[substr($1,1,6)]++,表示a[substr($1,1,6)]=a[substr($1,1,6)]+1;若要合计金额,如例2,则a[$2)]+=$4,等价于a[$2]=a[$2]+$4,$4表示第4字段,是金额字段;至于例3,又稍微复杂了点,要根据两个条件分组(月份substr($1,1,6)、操作员$6),那定义的数组就是a[substr($1,1,6)" "$6],注意下标中的" ",是为了输出时显示效果,你也可以改成别的,如改成"#",最后显示效果就是这样:
|
4、又想到稍微复杂点的,用到了sql语句的having筛选。
统计每年发工资的总额,显示超过750元的年份。
sql语句:
|
|
awk语句:
|
|
|
|
对应文件mx.txt和khxx.txt
mx.txt内容如下:
|
khxx.txt内容如下:
|
-------------例子开始-------------
1、统计出2007年1月份发生额总和大于2000的客户,列出帐号、姓名、月份、发生额合计
sql的表关联操作
|
awk的处理
|
|
|
就写到这吧,编数据,想例子好累。
chinaunix网友2009-02-08 12:20:27
awk处理大文件时,如果把数据全放到内存,会出现内存溢出(例如a[$1]=$2;行数太多时会出现错误),不知道LZ有没有碰过? 可否告之如何解决?