新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
家境小康, 积分 1828, 距离下一级还需 172 积分
论坛徽章:0
文件aaa.txt内容如下:
日期& && && && &手机号& && && && &姓名 (之间用\t分割)
& &&&& &&&aaa
& &&&& &&&bbb
表示开通记录,八月一号开通了这几个号码
文件bbb如下:
日期& && && && &手机号& && && && &操作id& &操作次数 (之间用\t分割)
& &&&& &&&5& && && && &2
& &&&& &&&2& && && && &2
& &&&& &&&3& && && && &2
& &&&& &&&5& && && && &2
& &&&& &&&4& && && && &2
& &&&& &&&5& && && && &2
类似的还有bbb、bbb……bbb,都是按天生成的日志文件。
现在要取出开通后10天内做了10次操作id为5的手机号,比如说8月1号开通的号码,8月1号做了1次id为5的操作,8月2号又做了一次,到8月10号的时候超过10次就把这个号码取出来,求一个思路啊
因为bbb这种文件是按天生成的,所以不好一次统计,只能根据aaa每天处理
& |& & |& & |& & |& 
家境小康, 积分 1828, 距离下一级还需 172 积分
论坛徽章:0
我现在的想的是,假如今天是8月1号,那我根据aaa.txt处理bbb,处理结果放倒一个临时文件里,每一行的内容是 手机号码&&天数 次数,然后8月2号的时候,根据aaa.txt处理bbb,把临时文件中的读出来跟8月2号处理的结果累加判断是否符合条件,不符合就修改临时文件(手机号码 天数 次数),一直到符合条件的写入最终结果。
有没有别的什么更好的思路呢?先说说思路就可,谢谢各位大侠啦
家境小康, 积分 1887, 距离下一级还需 113 积分
论坛徽章:0
本帖最后由 Kitaisky 于
02:54 编辑
%occurence = ();
$occurence{$cell_number} = $number_of_occurences if $id=5
while ( ($k, $v) = each %occurence) {
& &print &$k\n& if $v&10;
家境小康, 积分 1828, 距离下一级还需 172 积分
论坛徽章:0
& & 这样肯定不行的,因为bbb这种文件是每天生成的,需要每天处理,不是一个大文件,不可能用一个hash来统计出10这个次数的
稍有积蓄, 积分 289, 距离下一级还需 211 积分
论坛徽章:0
开通记录也是每天生成一个文件么?
家境小康, 积分 1828, 距离下一级还需 172 积分
论坛徽章:0
& & 是的,但是现在只考虑第一天生成的这个文件,只需要把这一个文件里符合条件的号码取出来就行
& & 您有什么好办法吗?
家境小康, 积分 1887, 距离下一级还需 113 积分
论坛徽章:0
本帖最后由 Kitaisky 于
10:31 编辑
while (&aaa.txt&) {
& && && &( $k ) = /\t\b(\d+)\b/ ;
& && && #$occurence{$key}
@ARGV =qw{ 0801.txt 0802.txt 0803.txt .....}
while (&&) {
& & ......
& & next unless (exists $occurence{$k})
& &........
家境小康, 积分 1828, 距离下一级还需 172 积分
论坛徽章:0
& & bbb这种文件每天生成每天处理,不可能一次读入的,囧
家境小康, 积分 1887, 距离下一级还需 113 积分
论坛徽章:0
回复&&Kitaisky
& & bbb这种文件每天生成每天处理,不可能一次读入的,囧
sosflyer 发表于
那就用&&use S 吧
稍有积蓄, 积分 334, 距离下一级还需 166 积分
论坛徽章:0
看起來每天生成的開通紀錄的檔名是由&bbb&+&日期&組成的
可以利用讀aaa.txt檔做出&$HASH{手機號}=開通日期&的hash
然後利用開檔的方式來讀開通日期+10天內的開通紀錄
接著再做統計
open(input,&aaa.txt&)
while($line=&input&)
&&chomp($line);
&&@array=split(/\t/,$line);
&&$hash{$array[2]}=$array[1];#由手機號轉開通日期
close(input);
foreach $K_hash(keys(%hash))
&&$count=0;#先把計數器歸0
&&for(0..9)
& & $date=$hash{$K_hash}+$_;#日期的處理可能需要特別去做,這個部分可以再討論
& & $inputfile=&bbb&.date
& & open(input,$inputfile);
& & while($line=&input&)
& && &chomp($line);
& && &@array=split(/\t/,$line);
& && &if($array[1] eq $K_hash && $array[2]==5)
& && &&&$count++;
& & close(input);
&&if($count&=10)
& & print $K_hash,&\n&;
類似像這樣的想法
不知道有符合樓主的要求嗎?
北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处