使用awk进行挑单

需求:

有两个文件话单文件 FILE_A, FILE_B,其中存放的内容格式为:

服务键值|主叫号码|被叫号码|主叫漫游地|被叫漫游地|通话开始时间|通话时长| (域之间以“|”分隔)

FILE_A文件内容:

    10001|13600001000|15900002000|8622222|8622222|20090402161616|61|
    10001|13600001000|15900002001|8622222|8622222|20090411131116|33|
    10001|13600002000|15900001111|8622222|8622222|20090413230139|331|
    10001|13600003000|15900002222|8622222|8622222|20090415092323|532|
    10001|13600001000|15900002123|8622222|8622222|20090418131029|78|
    10001|13600003000|15900002319|8622222|8622222|20090419211616|1024|
    10001|13600003001|15900002319|8622222|8622222|20090418211616|1024|

FILE_B文件内容:
    10001|13600001000|15900002000|8622222|8622222|20090402161616|61|
    10001|13600004000|15900002000|8622222|8622222|20090402161616|161|
    10001|13600002000|15900001111|8622222|8622222|20090413230139|331|
    10001|13600003000|15900002222|8622222|8622222|20090415092323|532|
    10001|13600004000|15900002222|8622222|8622222|20090416194333|222|

现在的需要将FILE_A中存在并且FILE_B中不存在的数据找出来,也就是挑单

 

思路:
    一个用户只能在一个时间打电话(当然如果用户有两个电话的话... 这种异常情况不考虑)

所以我们以主叫号码和通话起始时间作为过滤条件(主键)就可以找出FILE_A中存在而FILE_B中

不存在的记录

 

遍历FILE_B文件,读取每一行的主叫号码和通话开始时间(对应的列为2, 6)

    新建一个数组array_1

    将读取到的主叫号码和时间作为array_1数组的下标,并将该下表对应的值设置为1

   

遍历FILE_A文件,读取该文件的每一行,同时也读取主叫号码和通话开始时间

    index = FILE_A.主叫号码 + FILE_A.通话开始时间

    如果array_1[index] != 1, 则表明该条记录在FILE_B中不存在,记录为error,输出到output.unl文件中

    否则,该记录存在,记录为exist并输出到output.unl文件

   

此处就是用FILE_B中的字段(列2,6)作为hash索引的方式来排查FILE_A

 


对应的awk脚本

awk -F"|" -vFILEB="FILE_B.unl" -vOutputFileName="output.unl"  ' BEGIN {

    while ((rt = (getline line < FILEB)) > 0)         # 遍历FILE_B.unl

    {

         num_1 = split(line, recalcArr, "|");     # 以“|”分隔FILE_B中的内容

         t_index=recalcArr[2]recalcArr[6]         # 以列1和列9作为索引

         Array_1[t_index]=1;                      # 设置该数组值为1

    }

    }

   {

         t_flag=$2$6                              # 以列1和列9作为索引

         if (Array_1[t_flag] != 1) printf("%-8s:%s/n", "noexist", $0) >> OutputFileName;

         else printf("%-8s:%s/n", "exist", $0) >> OutputFileName;

    }

  END{

}' FILE_A.unl


 
output.unl文件的内容为:
exist   :10001|13600001000|15900002000|8622222|8622222|20090402161616|61|
noexist :10001|13600001000|15900002001|8622222|8622222|20090411131116|33|
exist   :10001|13600002000|15900001111|8622222|8622222|20090413230139|331|
exist   :10001|13600003000|15900002222|8622222|8622222|20090415092323|532|
noexist :10001|13600001000|15900002123|8622222|8622222|20090418131029|78|
noexist :10001|13600003000|15900002319|8622222|8622222|20090419211616|1024|
noexist :10001|13600003001|15900002319|8622222|8622222|20090418211616|1024|


使用grep "noexist" output.unl | awk -F':' '{print $2}'
就可以得出丢单的记录

 

结论:
该脚本主要是通过主键组成hash索引进行查询
使用awk脚本比较方便,我想使用其他的主流的编程语言也是一样的
这里不过是抛砖引玉,提供一种思路

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值