亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標題: 一個文件處理問題如何用perl寫出更短的代碼解決 [打印本頁]

作者: zzy7186    時間: 2011-02-12 18:31
標題: 一個文件處理問題如何用perl寫出更短的代碼解決
test文件內(nèi)容為:
aaa
001            123            728273
002            456            283940
003            789            928374
aaa
001            287            394872
003            729            493827
aaa
002            321            324815
bbb
003            524            520487
bbb
002            826            883674
003            673            092847
bbb
001            427            374859

要求分別得出aaa、bbb下001、002、003行中二列和三列的和,如:
aaa
001            410            1123145
002            777            608755
003            1518          1422201
bbb
001            427            374859
002            826            883674
003            1197          613334
這是shell版的一個問題,我自己想著用perl解決,但是寫出來的代碼感覺很搓,望高手能給出更短的代碼解決這個問題。
下面是我自己瞎寫的

  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. my %result;
  5. my $id1;
  6. while(<>){
  7.         my @temp=split;
  8.         my $id2;
  9.         if($#temp == 0){
  10.                 $id1=$temp[0];
  11.         } else {
  12.            $id2 = shift @temp;
  13.            unless(defined $result{$id1}{$id2})
  14.                 {
  15.                         $result{$id1}{$id2}=\@temp;
  16.                 }else{
  17.                         for(my $i=0;$i<=$#temp;$i++)
  18.                                 {
  19.                                         $result{$id1}{$id2}->[$i]+=$temp[$i];
  20.                                 }
  21.                 }


  22.         }
  23. }
  24. for my $i (sort keys %result){
  25.         print $i,"\n";
  26.         for my $j (sort { $a <=> $b } keys %{$result{$i}})
  27.         {
  28.                 print "$j\t",$result{$i}{$j}->[0],"\t",$result{$i}{$j}->[1],"\n";       }
  29. }
復制代碼
希望高手們能幫我指出不規(guī)范的地方。。。謝謝了!
作者: x9x9    時間: 2011-02-12 18:40
用hash啊
作者: zzy7186    時間: 2011-02-12 18:42
用hash啊
x9x9 發(fā)表于 2011-02-12 18:40



    我自己寫的就是用hash的
    $VAR1 = {
          'bbb' => {
                     '002' => [
                                '826',
                                '883674'
                              ],
                     '003' => [
                                1197,
                                613334
                              ],
                     '001' => [
                                '427',
                                '374859'
                              ]
                   },
          'aaa' => {
                     '003' => [
                                1518,
                                1422201
                              ],
                     '002' => [
                                777,
                                608755
                              ],
                     '001' => [
                                410,
                                1123145
                              ]
                   }
        };
作者: jason680    時間: 2011-02-12 22:59
本帖最后由 jason680 于 2011-02-12 23:09 編輯
test文件內(nèi)容為:
aaa
001            123            728273
002            456            283940
0 ...
zzy7186 發(fā)表于 2011-02-12 18:31
  1. #!/usr/bin/perl

  2. use strict;
  3. #基本上寫程式不是問題,除錯(debug)找問題才是問題....
  4. #所以code是不是(讓人)易于了解才是要在意問題.
  5. #注:容易了解程式code,才容易"除錯(debug)找問題"...

  6. #以下提供,我會用的方式.參考看看...
  7. my %ghResults;
  8. my $gsBlock;

  9. while(<DATA>){
  10.     next if(m/^\s*$/);  #處理空白行(非必要).... m/^\s*(#|$)/
  11.   
  12.     my($sId, @aTemp) = split;   #直接把id取出,不用再shift ...
  13.     if(@aTemp == 0){    # 或scalar @aTemp == 0, 少用$# 如果不是很必需
  14.         $gsBlock = $sId;
  15.         next;    #沒有其他事要做...就直接next,
  16.         #可以省下else ...及不必要的縮進
  17.     }
  18.    
  19.   
  20.     #如果資料(數(shù)字)一定是二個....(含id 三個)
  21.     if(@aTemp != 2){
  22.         print "some error :$_\n";
  23.         #exit 1;   
  24.         # $error =1; next;
  25.     }
  26.   
  27.     #在這里defined ...的判斷是不用的....
  28.     #if(defined $ghResults{$gsBlock}->{$sId}){
  29.         foreach(0 .. @aTemp -1){   #  $#aTemp
  30.             #print "get $aTemp[$_]\n";   # for debug
  31.             $ghResults{$gsBlock}->{$sId}->[$_] += $aTemp[$_];   
  32.         }
  33.     #}
  34.     #else{
  35.     #    # print "get @aTemp\n"; # for debug
  36.     #    $ghResults{$gsBlock}->{$sId} = [@aTemp];
  37.     #}
  38. }

  39. foreach my $sBlock(sort keys %ghResults){
  40.     local $" ="\t";  
  41.     print "$sBlock\n";
  42.     foreach(sort keys %{$ghResults{$sBlock}}){
  43.         # 簡易輸出... (設定local $")
  44.         #print "$_\t@{$ghResults{$sBlock}->{$_}}\n";
  45.         
  46.         # 數(shù)字對齊輸出...
  47.         my $sOut = "";
  48.         $sOut .= sprintf("%12d",$_) for (@{$ghResults{$sBlock}->{$_}});
  49.         print "$_$sOut\n";
  50.     }
  51. }

  52. __DATA__
  53. aaa
  54. 001            123            728273
  55. 002            456            283940
  56. 003            789            928374
  57. aaa
  58. 001            287            394872
  59. 003            729            493827
  60. aaa
  61. 002            321            324815
  62. bbb
  63. 003            524            520487
  64. bbb
  65. 002            826            883674 22
  66. 003            673            092847
  67. bbb
  68. 001            427            374859
復制代碼
perl block_array.pl
some error :002            826            883674 22

aaa
001         410     1123145
002         777      608755
003        1518     1422201
bbb
001         427      374859
002         826      883674          22
003        1197      613334

作者: x9x9    時間: 2011-02-13 08:57
越寫越復雜啊。個人覺得這樣的問題也許是用一次就不會再用的腳本,或許不必寫的如何通用。
  1. use strict;
  2. use warnings;

  3. my %hash;
  4. my $id;
  5. while (<DATA>) {
  6. chomp;
  7. if (/[^\d|\t|\s]/){
  8. $id=$_;
  9. } else {
  10. my ($x,$y,$z)=split;
  11. $hash{$id}{$x}{'col1'}+=$y;
  12. $hash{$id}{$x}{'col2'}+=$z;
  13. }
  14. }

  15. foreach my $k (sort keys %hash){
  16. print $k."\n";
  17. foreach my $kk (sort keys %{$hash{$k}}) {
  18. print $kk."\t".$hash{$k}{$kk}->{'col1'}."\t".$hash{$k}{$kk}->{'col2'}."\n";
  19. }
  20. }

  21. __DATA__
  22. aaa
  23. 001            123            728273
  24. 002            456            283940
  25. 003            789            928374
  26. aaa
  27. 001            287            394872
  28. 003            729            493827
  29. aaa
  30. 002            321            324815
  31. bbb
  32. 003            524            520487
  33. bbb
  34. 002            826            883674
  35. 003            673            092847
  36. bbb
  37. 001            427            374859
復制代碼

作者: iLRainyday    時間: 2011-02-13 14:10
本帖最后由 iLRainyday 于 2011-02-13 14:13 編輯

這個夠不夠短?最后的輸出部分很丑~~
  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;

  4. my $block_id;
  5. my %blocks;

  6. while (<DATA>) {
  7.     if (/^[a-z]/i) {
  8.         chomp;
  9.         $block_id = $_;
  10.     }
  11.     else {
  12.         my ($col_1, $col_2, $col_3) = split;
  13.         $blocks{$block_id}->{$col_1} =
  14.                        [ $blocks{$block_id}->{$col_1}[0] += $col_2,
  15.                          $blocks{$block_id}->{$col_1}[1] += $col_3 ];
  16.     }
  17. }

  18. for $block_id (keys %blocks) {
  19.     print "$block_id\n";
  20.     for my $key (keys %{ $blocks{$block_id} }) {
  21.         print "$key\t\t";
  22.         print "$blocks{$block_id}->{$key}[0]"
  23.               ."\t\t"
  24.               ."$blocks{$block_id}->{$key}[1]"
  25.               ."\n";
  26.      }
  27. }


  28. __DATA__
  29. aaa
  30. 001            123            728273
  31. 002            456            283940
  32. 003            789            928374
  33. aaa
  34. 001            287            394872
  35. 003            729            493827
  36. aaa
  37. 002            321            324815
  38. bbb
  39. 003            524            520487
  40. bbb
  41. 002            826            883674
  42. 003            673            092847
  43. bbb
  44. 001            427            374859
復制代碼





歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2