需求:
有两个文件话单文件 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脚本比较方便,我想使用其他的主流的编程语言也是一样的
这里不过是抛砖引玉,提供一种思路