Chinaunix

标题: 关于一个累加的问题 [打印本页]

作者: nanshanjin    时间: 2015-07-27 16:16
标题: 关于一个累加的问题
这里有一个文件,格式如下:
01   2
01   4
...   ...
02  1
02  3
...  ...
03 6
... ...
把分别把01,02,03.。。。对应的那列数字累加,输出为
01  sum
02  sum
03  sum
...  ...
怎么实现?
作者: substr函数    时间: 2015-07-27 17:03
  1. #!/usr/bin/perl

  2. my $col1;
  3. my $sum;
  4. while (<DATA>) {
  5.     if (/^\./) {
  6.         print "$col1\t$sum\n";
  7.         $sum = 0;
  8.     }
  9.     else {
  10.         my @line = split;
  11.         $col1 = $line[0];
  12.         $sum += $line[1];
  13.     }
  14. }

  15. __DATA__
  16. 01   2
  17. 01   4
  18. ...   ...
  19. 02  1
  20. 02  3
  21. ...  ...
  22. 03 6
  23. ... ...
复制代码

作者: MMMIX    时间: 2015-07-27 17:07
回复 2# substr函数


    我十分怀疑 ... ... 是输入数据的一部分。
作者: substr函数    时间: 2015-07-27 17:10
回复 3# MMMIX


1楼发的
格式如下
  1. 01   2
  2. 01   4
  3. ...   ...
  4. 02  1
  5. 02  3
  6. ...  ...
  7. 03 6
  8. ... ...
复制代码

作者: MMMIX    时间: 2015-07-27 17:13
回复 4# substr函数


    那你应该在最后再输出一行 ... ... 呀
作者: substr函数    时间: 2015-07-27 17:20
回复 5# MMMIX

谢谢大神指点!
  1. #!/usr/bin/perl

  2. my $col1;
  3. my $sum;
  4. while (<DATA>) {
  5.     if (/^\./) {
  6.         print "$col1\t$sum\n";
  7.         $sum = 0;
  8.     }
  9.     else {
  10.         my @line = split;
  11.         $col1 = $line[0];
  12.         $sum += $line[1];
  13.     }
  14. }
  15. print "...   ...\n";

  16. __DATA__
  17. 01   2
  18. 01   4
  19. ...   ...
  20. 02  1
  21. 02  3
  22. ...  ...
  23. 03 6
  24. ... ...
复制代码

作者: nanshanjin    时间: 2015-07-27 19:27
... ...是省略号
   
作者: b114213903    时间: 2015-07-27 20:33
  1. #!/usr/bin/perl
  2. use strict;

  3. my $sum={};
  4. while(<DATA>){
  5.         chomp;
  6.         my ($key,$value)=split;
  7.         $sum->{$key}+=$value;
  8. }

  9. foreach my $key (sort {$a<=>$b} keys %{$sum}){
  10.         print "$key\t$sum->{$key}\n";
  11. }
复制代码

作者: rubyish    时间: 2015-07-28 01:01
perl abc.pl data > save
  1. #!/usr/bin/perl

  2. my ( $K, $V ) = '';
  3. while (<DATA>) {
  4.     my ( $k, $v ) = split;
  5.     if ( $K ne $k ) {
  6.         print $K, "\t", $V, $/ if $K;
  7.         ( $K, $V ) = ( $k, 0 );
  8.     }
  9.     $V += $v;
  10. }
  11. print $K, "\t", $V, $/;
复制代码

作者: nanshanjin    时间: 2015-07-28 09:19
$sum->{$key}是什么意思?

   
作者: nanshanjin    时间: 2015-07-28 09:20
回复 8# b114213903



   
$sum->{$key}是什么意思?
作者: 815138698    时间: 2015-07-28 19:34
回复 10# nanshanjin

哈希的引用
   
作者: 清泉一边    时间: 2015-08-14 11:17
  1. #!/usr/bin/perl  -w
  2. use strict;
  3. my %hash;
  4. while (<DATA>){
  5. my( $k,$v) = split;
  6. push @{$hash{$k}} ,$v;
  7. }
  8. foreach my $k(sort keys %hash){
  9. print "$k\t";
  10. my $sum = 0;
  11. $sum += $_ for @{$hash{$k}};
  12. print "$sum\n";
  13. }


  14. __DATA__
  15. 01   2
  16. 01   4
  17. 02  1
  18. 02  3
  19. 03 6
复制代码
回复 1# nanshanjin


   
作者: sunzhiguolu    时间: 2016-03-19 20:54
  1. perl -alne "{$h{$F[0]}+=$F[-1]}END{print \"$_ $h{$_}\" for keys %h}" ur.txt
复制代码





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2