Chinaunix首页 | 论坛 | 博客
  • 博客访问: 553250
  • 博文数量: 38
  • 博客积分: 10093
  • 博客等级: 上将
  • 技术积分: 1460
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-24 13:04
文章分类

全部博文(38)

文章存档

2012年(1)

2010年(9)

2009年(3)

2008年(25)

我的朋友

分类: LINUX

2010-11-11 13:49:09

result.txt 第一列是RTX 第2列的是等级 第3行是在线时间
要求
1.第一列显示RTX
2.列出相同RTX的总在线时间
3.列出等级<=30 ,>=50的RTX号
5723997  30  301011144
1721922  43  201022114
3423993  58  401011144
5723997  34  244011144
1273997  13  545101114

求解最后显示格式要这个一样


我的答案:




#!/usr/bin/perl

use strict;
use warnings;

my @rec;
my %rtx;

while (<DATA>)
{
    my @r = split;
    if ( $r[1] <= 30 || $r[1] >= 50)
    {
        push @rec ,\@r;
    }
}

foreach (@rec)
{    
    $rtx{$_->[0]}->{level} = $_->[1];
    $rtx{$_->[0]}->{time} += $_->[2];
}


foreach my $no (keys %rtx )
{
    print "$no\t$rtx{$no}->{level}\t$rtx{$no}->{time}\n";
}


__DATA__
5723997 30 301011144
5723997 31 301011144
1721922 43 201022114
3423993 58 401011144
5723997 34 244011144
1273997 13 545101114
3423993 58 401011144



另一位大牛写的相对简单的代码:


my %hash;
while (<>) {
    my ($id,$level,$time)=split;
    $hash{$id}{$time}+=$time;
}
foreach my $id (kyes %hash) {
    print "$id $hash{$id}{$level} $hash{$id}{time}\n" if $hash{$id}{$level} ge 30 and $hash{$id}{$level} le 50 ;
}


如果只是取RTX,grep最好了



我的改正:


use strict;
use warnings;


my %hash;
while (<DATA>)
{
        my ($id,$level,$time)=split;

        # 在这里把不需要的数据清出去,不做过多的处理
        next if ($level > 30 && $level < 50);
        $hash{$id}{time}+=$time;
        $hash{$id}{level}+=$level;

}
foreach my $id (kyes %hash)
{
    print "$id $hash{$id}{level} $hash{$id}{time}\n";
}



__DATA__
5723997 30 301011144
5723997 31 301011144
1721922 43 201022114
3423993 58 401011144
5723997 34 244011144
1273997 13 545101114
3423993 58 401011144



如有不正确的地方,欢迎指正!!!!
阅读(1091) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~