关于数据去重

关于数据去重

id      time         ip         cid
1    2009-1-9 9:56:59    116.24.140.198    250032
2    2009-1-9 9:57:03    219.132.186.129    9620
3    2009-1-9 9:57:09    219.132.186.129    251402
4    2009-1-9 9:57:21    116.25.154.18    251187
5    2009-1-9 9:57:36    58.251.2.30    251630
6    2009-1-9 9:57:42    58.212.22.246    251377
7    2009-1-9 9:58:16    121.34.93.154    251623
8    2009-1-9 9:58:35    121.15.23.50    251169
9    2009-1-9 9:59:01    116.25.20.246    9251
10    2009-1-9 9:59:09    116.25.16.68    251623
11    2009-1-9 10:00:09    221.229.213.51    251441
12    2009-1-9 10:00:20    221.229.213.51    250106
13    2009-1-9 10:00:22    221.229.213.51    10518
14    2009-1-9 10:00:22    221.229.213.51    7738
15    2009-1-9 10:00:24    58.248.228.63    251349
16    2009-1-9 10:00:28    59.53.245.135    250947
17    2009-1-9 10:00:27    58.248.228.63    8889
18    2009-1-9 10:00:31    119.99.230.14    8823
19    2009-1-9 10:00:31    218.17.237.43    10127
20    2009-1-9 10:00:32    125.70.105.204    251177


上面的数据按下面这个条件去重,请教个思路,谢谢。
time在1分钟内,ip相同,cid相同,随机保留一条。

保留第一条

[Copy to clipboard] [ - ]
CODE:
perl -ne 'if ($. == 1) {print;next} ($id, $d, $t,$ip, $cid)=split;$key=$d." ".join(":", (split /:/,$t)[0..1])." ".$ip." ".$cid;print if !$entry{$key}++'



QUOTE:
原帖由 ynchnluiti 于 2009-1-9 10:40 发表
保留第一条
perl -ne 'if ($. == 1) {print;next} ($id, $d, $t,$ip, $cid)=split;$key=$d." ".join(":", (split /:/,$t)[0..1])." ".$ip." ".$cid;print if !$entry{$key}++'

谢谢。。大师啊,我得理解半天咯。

这些数据是在DB里,用foreach取出来的。
噢,那你可能要把上面的代码结合到你的脚本中。(把DB里的数据处理后存到文件,在命令行里使用上述代码处理也可以)


QUOTE:
原帖由 ynchnluiti 于 2009-1-9 10:54 发表
噢,那你可能要把上面的代码结合到你的脚本中。(把DB里的数据处理后存到文件,在命令行里使用上述代码处理也可以)

恩,谢谢。

可以对二维数组直接操作吗?


while (my $hash_ref = $sth->fetchrow_hashref) {
        my $id        =       $hash_ref->{'id'};
        my $time     =      $hash_ref->{'time'};
        my $ip        =       $hash_ref->{'ip'};
        my $cid       =       $hash_ref->{'cid'};

        #将所有数据存入二维数组

        @data = ($id,$time,$ip,$cid);
        $data_list[$i++] = [@data];

}




QUOTE:
原帖由 枫影谁用了 于 2009-1-9 11:02 发表


恩,谢谢。

可以对二维数组直接操作吗?

可以啊。根据二维数组拼hash的key


QUOTE:
原帖由 ynchnluiti 于 2009-1-9 11:07 发表

可以啊。根据二维数组拼hash的key

while (my $hash_ref = $sth->fetchrow_hashref) {
        my $id        =       $hash_ref->{'id'};
        my $time     =      $hash_ref->{'time'};
        my $ip        =       $hash_ref->{'ip'};
        my $cid       =       $hash_ref->{'cid'};

        #将所有数据存入二维数组

        @data = ($id,$time,$ip,$cid);
        $data_list[$i++] = [@data];

}


好的,我看下手册,对数组怎么hash。谢谢


QUOTE:
谢谢。。大师啊,我得理解半天咯。

这些数据是在DB里,用foreach取出来的。

看上去你的数据已经按时间排序了 那么只要和前一行比较就好了.



QUOTE:
原帖由 DQP 于 2009-1-9 11:19 发表


不取那些不想要的数据不就好了, 为什么还要取出来再过滤呢
取这些无用的数据太浪费了资源了

对噢,我光想着怎么处理了文件了。可以修改sql语句去掉重复的吧
sql做起来有点困难吧。

而且数据是要取出来的,因为还有其它处理