免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3507 | 回复: 5
打印 上一主题 下一主题

perl文件汇总处理? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-21 18:31 |只看该作者 |倒序浏览
我又一个这样的文件:
2011-07-14      508659  47565   1454    268418  7414    120506  42236   18341   1724    1001
2011-07-15      512299  49171   1451    272390  9257    115802  41476   19736   1913    1103
2011-07-16      593584  64497   1938    315873  12554   121701  51259   22347   2258    1157
2011-07-17      579760  61131   1871    324644  12819   112279  43750   20446   2298    522
2011-07-18      488095  46196   1351    268757  9447    101951  39843   18563   1758    229
2011-07-19      506264  47166   1369    274203  9608    117195  36280   18357   1849    237
2011-07-20      542874  44995   2919    1457    273729  9865    128045  36265   43493   2050    56
每列之间用\t分隔,我想把除日期之外的数据分列求和,最好把日期写到第一列:结果如下:
07.17--07.20    3731535 360721  12353   1725742 334828  699299  382889  154055  55293   6299    56  
谢谢!

论坛徽章:
0
2 [报告]
发表于 2011-07-22 03:06 |只看该作者
  1. #!/usr/bin/perl -w
  2. open FH,"</home/kurri/Templates/abc";
  3. my @info;
  4. while (<FH>) {
  5.     chomp;
  6.     my @tmp = (split /\s+/);
  7.     push @{$info[0]},$tmp[0];
  8.     my $i = 1;
  9.     while ($i < @tmp) {
  10.         $info[$i] += $tmp[$i];
  11.         $i++;
  12.     }
  13. }
  14. close FH;
  15. $info[0]->[0] =~ s/^\d+-(\d+)-(\d+)$/$1.$2/;
  16. $info[0]->[-1] =~ s/^\d+-(\d+)-(\d+)$/$1.$2/;
  17. $info[0] = $info[0]->[0]."--".$info[0]->[-1];
  18. print join "\t",@info,"\n";
复制代码
初学写的很丑。。。

论坛徽章:
0
3 [报告]
发表于 2011-07-22 04:49 |只看该作者
本帖最后由 albertd 于 2011-07-22 04:52 编辑
  1. my (@a,@b,@c);
  2. while (<>) {
  3.     chomp;
  4.     @a = split /\s+/;
  5.     push (@b, (substr shift @a, 5));
  6.     foreach (0..$#a) {
  7.         $c[$_] += $a[$_];
  8.     }
  9. }
  10. print "$b[0]--$b[-1] @c\n";
复制代码

论坛徽章:
1
双子座
日期:2013-11-06 17:18:01
4 [报告]
发表于 2011-07-22 09:54 |只看该作者
本帖最后由 seufy88 于 2011-07-22 10:06 编辑

初学的。试一下
open my $FD,'<','/tmp/file';

my $count=0;
my @array;
while(<$FD>){
        chomp;
        my @fields=split/\s+/,$_;
        $array[$count]=\@fields;
        $count+=1;

}
my @result;

for my $j (1..11){
my $temp;
for my $i (0..$#array){
        $temp=$temp+$array[$i][$j];
}
        push @result,$temp;
}
print "@result\n";

论坛徽章:
0
5 [报告]
发表于 2011-07-22 11:40 |只看该作者
本帖最后由 xxhacker 于 2011-07-22 11:42 编辑

  1. #! /usr/bin/perl

  2. my (@a,@b);
  3. while(<DATA>) {
  4.         @a = split;       
  5.         for (my $i=1;$i<=$#a;$i++) {
  6.                 $b[$i] += $a[$i];               
  7.         }       
  8. }

  9. print "@b";
  10. __DATA__
  11. 2011-07-14      508659  47565   1454    268418  7414    120506  42236   18341   1724    1001
  12. 2011-07-15      512299  49171   1451    272390  9257    115802  41476   19736   1913    1103
  13. 2011-07-16      593584  64497   1938    315873  12554   121701  51259   22347   2258    1157
  14. 2011-07-17      579760  61131   1871    324644  12819   112279  43750   20446   2298    522
  15. 2011-07-18      488095  46196   1351    268757  9447    101951  39843   18563   1758    229
  16. 2011-07-19      506264  47166   1369    274203  9608    117195  36280   18357   1849    237
  17. 2011-07-20      542874  44995   2919    1457    273729  9865    128045  36265   43493   2050    56
复制代码
看了楼主的需求,我自己也写了一个,哈哈,竟然和三楼的思路竟是一样的~~

论坛徽章:
0
6 [报告]
发表于 2011-07-22 11:44 |只看该作者
  1. perl -F'\t' -ane '$a=0;foreach (@F[1..$#F]){$a+=$_;}print "$F[0] $a @F[1..$#F]";' file
复制代码
一句话就够了~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP