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

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問板塊 發(fā)新帖
查看: 3107 | 回復(fù): 9
打印 上一主題 下一主題

[已解決,謝謝各位]請(qǐng)問如何用perl求行名相同列的平均值(含有很多列),謝謝 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2015-10-13 15:56 |只看該作者 |倒序?yàn)g覽
本帖最后由 baiguihuajl 于 2015-10-14 13:59 編輯

請(qǐng)問如何求行名相同列的平均值(含有很多列),謝謝
比如文件1.txt
a        2        3        1        3        2        2
s        2        2        1        1        2        3
s        1        2        3        1        2        2
f        3        7        2        1        2        1
v        2        1        3        2        2        1
t        2        2        2        2        1        3
b        3        2        2        1        5        2
g        1        3        1        2        1        2
r        2        1        1        1        1        1
t        2        2        1        3        2        3
a        2        3        3        5        2        4
f        3        1        2        2        5        2
s        1        1        4        9        2        5
相同行名的列求平均的話就會(huì)得到2.txt:
a        2        3        2        4        2        3
s        1.33        1.67        2.67        3.67        2        3.33
f        3        4        2        1.5        3.5        1.5
v        2        1        3        2        2        1
t        2        2        1.5        2.5        1.5        3
b        3        2        2        1        5        2
g        1        3        1        2        1        2
r        2        1        1        1        1        1

論壇徽章:
7
巳蛇
日期:2013-11-28 09:22:59天秤座
日期:2014-10-25 15:40:452015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亞冠之德黑蘭石油
日期:2015-07-15 08:46:452015亞冠之平陽(yáng)省
日期:2015-11-08 16:27:53白銀圣斗士
日期:2015-11-14 09:58:12
2 [報(bào)告]
發(fā)表于 2015-10-13 18:00 |只看該作者
  1. #!/usr/bin/perl
  2. use strict;
  3. use Data::Dumper;

  4. my $data={};        #用來保存數(shù)據(jù)
  5. my $num={};                #用來保存出現(xiàn)次數(shù)
  6. my @keys=();        #用來記錄出現(xiàn)順序
  7. while(my $line=<DATA>){
  8.         my ($key,@values)=split /\s+/,$line;
  9.         if($data->{$key}){
  10.                 $num->{$key}++;
  11.                 my $val_num=scalar @{$data->{$key}};
  12.                 for (my $i=0;$i<$val_num;$i++){
  13.                         $data->{$key}->[$i]+=$values[$i];
  14.                 }
  15.         }else{
  16.                 $data->{$key}=\@values;
  17.                 $num->{$key}++;
  18.                 push @keys,$key;
  19.         }
  20. }

  21. foreach my $key(@keys){
  22.         my $val_num=scalar @{$data->{$key}};
  23.         print "$key\t";
  24.         for (my $i=0;$i<$val_num;$i++){
  25.                 my $val= ($data->{$key}->[$i]) / ($num->{$key});        #依據(jù)次數(shù)計(jì)算平均值
  26.                 my $mod=($data->{$key}->[$i]) % ($num->{$key});                #判斷是否整除
  27.                 if($mod){
  28.                         printf "%-.2f\t",$val;
  29.                 }else{
  30.                         print "$val\t";
  31.                 }
  32.         }
  33.         print "\n";
  34. }

  35. __DATA__
  36. a        2        3        1        3        2        2
  37. s        2        2        1        1        2        3
  38. s        1        2        3        1        2        2
  39. f        3        7        2        1        2        1
  40. v        2        1        3        2        2        1
  41. t        2        2        2        2        1        3
  42. b        3        2        2        1        5        2
  43. g        1        3        1        2        1        2
  44. r        2        1        1        1        1        1
  45. t        2        2        1        3        2        3
  46. a        2        3        3        5        2        4
  47. f        3        1        2        2        5        2
  48. s        1        1        4        9        2        5
復(fù)制代碼

論壇徽章:
307
程序設(shè)計(jì)版塊每周發(fā)帖之星
日期:2016-04-08 00:41:33操作系統(tǒng)版塊每日發(fā)帖之星
日期:2015-09-02 06:20:00每日論壇發(fā)貼之星
日期:2015-09-02 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-04 06:20:00每日論壇發(fā)貼之星
日期:2015-09-04 06:20:00每周論壇發(fā)貼之星
日期:2015-09-06 22:22:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-09 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-19 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-20 06:20:00每日論壇發(fā)貼之星
日期:2015-09-20 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-22 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-24 06:20:00
3 [報(bào)告]
發(fā)表于 2015-10-13 18:40 |只看該作者
本帖最后由 sunzhiguolu 于 2015-10-13 23:40 編輯

試下:

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my %h_keys;
  5. while (<>){
  6.    chomp;
  7.    my @a_line = split /\s+/;
  8.    my $id = shift @a_line;
  9.    if (exists $h_keys{$id}){
  10.       $h_keys{$id} .= ';' . "@a_line";
  11.    }else{
  12.       $h_keys{$id} = "@a_line";
  13.    }   
  14. }

  15. while (my ($id, $numbers) = each %h_keys){
  16.    my $cnt_rows = my @a_lines = split (/;/, $numbers);
  17.    if ($cnt_rows == 1){
  18.       print "$id $numbers\n";
  19.    }else{
  20.       print "$id";
  21.       my $cnt_cols = my @a_numbers = split /\s+/,(shift @a_lines);
  22.       foreach (@a_lines){
  23.          my @a_other_numbers = split /\s+/;
  24.          for (my $i = 0; $i < $cnt_cols; $i++){
  25.             $a_numbers[$i] += $a_other_numbers[$i];
  26.          }   
  27.       }   
  28.       for (my $i = 0; $i < $cnt_cols; $i++){
  29.          my $value = $a_numbers[$i];
  30.          $value % $cnt_rows == 0 ? printf " %d", $value / $cnt_rows : printf " %.2f", $value / $cnt_rows;
  31.       }   
  32.       print "\n";
  33.    }   
  34. }
復(fù)制代碼

  1. perl abc.pl 1.txt > 2.txt
復(fù)制代碼

論壇徽章:
95
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-05 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-17 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-18 06:20:002015亞冠之阿爾艾因
日期:2015-09-18 10:35:08月度論壇發(fā)貼之星
日期:2015-09-30 22:25:002015亞冠之阿爾沙巴布
日期:2015-10-03 08:57:39程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-05 06:20:00每日論壇發(fā)貼之星
日期:2015-10-05 06:20:002015年亞冠紀(jì)念徽章
日期:2015-10-06 10:06:482015亞冠之塔什干棉農(nóng)
日期:2015-10-19 19:43:35程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-21 06:20:00每日論壇發(fā)貼之星
日期:2015-09-14 06:20:00
4 [報(bào)告]
發(fā)表于 2015-10-13 21:14 |只看該作者
這種寫法是不是太復(fù)雜?

#!/usr/bin/perl

use strict;
use warnings;

use v5.14;
use List::MoreUtils qw(pairwise);

my %rec;
while (<DATA>) {
  chomp;
  my ($key, @vals) = split;
  if ($rec{$key}) {
    $rec{$key} = [ pairwise { [ ++($a->[0]), $a->[1] += $b ] } @{ $rec{$key} }, @vals ];
  }
  else {
    $rec{$key} = [ map [1, $_], @vals ];
  }
}

while (my ($key, $vals) = each %rec) {
  say join "\t", ($key, map { $_->[1] / $_->[0] } @$vals);
}

__DATA__
a        2        3        1        3        2        2
s        2        2        1        1        2        3
s        1        2        3        1        2        2
f        3        7        2        1        2        1
v        2        1        3        2        2        1
t        2        2        2        2        1        3
b        3        2        2        1        5        2
g        1        3        1        2        1        2
r        2        1        1        1        1        1
t        2        2        1        3        2        3
a        2        3        3        5        2        4
f        3        1        2        2        5        2
s        1        1        4        9        2        5

論壇徽章:
95
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-05 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-17 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-18 06:20:002015亞冠之阿爾艾因
日期:2015-09-18 10:35:08月度論壇發(fā)貼之星
日期:2015-09-30 22:25:002015亞冠之阿爾沙巴布
日期:2015-10-03 08:57:39程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-05 06:20:00每日論壇發(fā)貼之星
日期:2015-10-05 06:20:002015年亞冠紀(jì)念徽章
日期:2015-10-06 10:06:482015亞冠之塔什干棉農(nóng)
日期:2015-10-19 19:43:35程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-21 06:20:00每日論壇發(fā)貼之星
日期:2015-09-14 06:20:00
5 [報(bào)告]
發(fā)表于 2015-10-13 21:50 |只看該作者
回復(fù) 4# MMMIX


   
利用 Perl 5.12 的新 each 和 autovivification,連 pairwise 都可以省了,代碼可以更簡(jiǎn)潔,也更易懂:

#!/usr/bin/perl

use strict;
use warnings;

use v5.14;

my %rec;
while (<DATA>) {
  chomp;
  my ($key, @vals) = split;
  while (my ($i, $v) = each @vals) {
    $rec{$key}->[$i][0] += 1;
    $rec{$key}->[$i][1] += $v;
  }
}

while (my ($key, $vals) = each %rec) {
  say join "\t", ($key, map { $_->[1] / $_->[0] } @$vals);
}

__DATA__
a        2        3        1        3        2        2
s        2        2        1        1        2        3
s        1        2        3        1        2        2
f        3        7        2        1        2        1
v        2        1        3        2        2        1
t        2        2        2        2        1        3
b        3        2        2        1        5        2
g        1        3        1        2        1        2
r        2        1        1        1        1        1
t        2        2        1        3        2        3
a        2        3        3        5        2        4
f        3        1        2        2        5        2
s        1        1        4        9        2        5

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2015-10-14 17:05 |只看該作者
回復(fù) 5# MMMIX


    你好,關(guān)于這個(gè)題目 我在實(shí)現(xiàn)相加的時(shí)候?yàn)槭裁粗挥械谝粋(gè)元素相加了,而后面的沒有,幫忙看下我的代碼哪邊出的問題,思考很久也沒有解決,沒有辦法只能上來請(qǐng)教了。

#!/usr/bin/perl
use strict;
use Data:umper;

my %hash;
while(<DATA>{
        chomp;
        my($key,@vals)=split;
        if(!exists $hash{$key}){
                $hash{$key}[0]=\@vals;
                $hash{$key}[1]=1;
        }
        for(my $i=(0..$#vals)){
                        $hash{$key}[0][$i]+=$vals[$i];
                        $hash{$key}[1]++;
        }
}

print Dumper(%hash);

論壇徽章:
95
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-05 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-17 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-18 06:20:002015亞冠之阿爾艾因
日期:2015-09-18 10:35:08月度論壇發(fā)貼之星
日期:2015-09-30 22:25:002015亞冠之阿爾沙巴布
日期:2015-10-03 08:57:39程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-05 06:20:00每日論壇發(fā)貼之星
日期:2015-10-05 06:20:002015年亞冠紀(jì)念徽章
日期:2015-10-06 10:06:482015亞冠之塔什干棉農(nóng)
日期:2015-10-19 19:43:35程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-21 06:20:00每日論壇發(fā)貼之星
日期:2015-09-14 06:20:00
7 [報(bào)告]
發(fā)表于 2015-10-14 21:32 |只看該作者
回復(fù) 6# 815138698


    for 語(yǔ)句錯(cuò)了;還有這個(gè) for 應(yīng)該放在 else 里面:

my %hash;
while (<DATA>) {
  chomp;
  my ($key,@vals) = split;
  if (not exists $hash{$key}) {
    $hash{$key}[0] = \@vals;
    $hash{$key}[1] = 1;
  }
  else {
    for my $i (0 .. $#vals) {
      $hash{$key}[0][$i] += $vals[$i];
    }
    $hash{$key}[1] += 1;
  }
}

print Dumper(\%hash);


不過,上述代碼可以簡(jiǎn)化為:

my %hash;
while (<DATA>) {
  chomp;
  my ($key,@vals) = split;
  while (my ($i, $v) = each @vals) {
    $hash{$key}[0][$i] += $v;
  }
  $hash{$key}[1] += 1;
}

print Dumper(\%hash);


論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2015-10-15 10:38 |只看該作者
回復(fù) 7# MMMIX


    For的用法 沒有掌握好  按照自己想的錯(cuò)誤格式來寫了,多謝指正~
    還有您提到的each array的用法 也是第一次見到  學(xué)習(xí)了  非常感謝~

論壇徽章:
95
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-05 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-17 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-18 06:20:002015亞冠之阿爾艾因
日期:2015-09-18 10:35:08月度論壇發(fā)貼之星
日期:2015-09-30 22:25:002015亞冠之阿爾沙巴布
日期:2015-10-03 08:57:39程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-05 06:20:00每日論壇發(fā)貼之星
日期:2015-10-05 06:20:002015年亞冠紀(jì)念徽章
日期:2015-10-06 10:06:482015亞冠之塔什干棉農(nóng)
日期:2015-10-19 19:43:35程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-21 06:20:00每日論壇發(fā)貼之星
日期:2015-09-14 06:20:00
9 [報(bào)告]
發(fā)表于 2015-10-15 12:21 |只看該作者
815138698 發(fā)表于 2015-10-15 10:38
回復(fù) 7# MMMIX

  還有您提到的each array的用法 也是第一次見到


Perl 5.12 的新特性。

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2015-10-15 12:29 |只看該作者
  1. use 5.010;

  2. my %data;

  3. while (<DATA>) {
  4.     my ( $name, @val ) = split;
  5.     $data{$name}[$_] += $val[$_] for 0 .. $#val;
  6.     $data{$name}[@val]++;
  7. }

  8. while ( my ( $name, $val ) = each %data ) {
  9.     my $count = pop @$val;
  10.     say join "\t", $name, map { sprintf "%.2f", $_ / $count } @$val;
  11. }

  12. __DATA__
  13. a        2        3        1        3        2        2
  14. s        2        2        1        1        2        3
  15. s        1        2        3        1        2        2
  16. f        3        7        2        1        2        1
  17. v        2        1        3        2        2        1
  18. t        2        2        2        2        1        3
  19. b        3        2        2        1        5        2
  20. g        1        3        1        2        1        2
  21. r        2        1        1        1        1        1
  22. t        2        2        1        3        2        3
  23. a        2        3        3        5        2        4
  24. f        3        1        2        2        5        2
  25. s        1        1        4        9        2        5
復(fù)制代碼
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP