免费注册 查看新帖 |

Chinaunix

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

求助计算平均值的Perl程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-24 13:30 |只看该作者 |倒序浏览
我有一个文件,其内容是:1 1 1 -1 1 1 1 1 -1 1 1 -1 -1 1 -1 1 1 -1 -1 1 1 1 1 1 1 -1 1 1 1 1 1 -1 -1 1 1 -1 1 1 1 -1 1 1 1 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 1 1 1 1 1 1 -1 1 -1 1 -1 1 1 1 1 1 1 -1 -1 1 1 1 1 -1 1 -1 -1 -1 1 1 1 1 1 1 -1 1 1 1 1 1 -1 1 1 1 1 1 1 1 -1 -1 1 1 1 -1 -1 1 1 -1 -1 -1 1 1 -1 1 1 1 1 -1 1 -1 1 -1 1 1 -1 -1 1 1 1 1 1 1 1 每个数字之间有空格隔开,现要逐级的计算每4个数的平均值,即第1--4位这4个数平均值,返回数值;第2--5位的4个数返回一个平均值;第3--6位这4个数返回一个平均值。我的数据较大,由于本人Perl编程水平一般,希望高手赐教,衷心谢谢!!

论坛徽章:
8
技术图书徽章
日期:2013-09-30 08:51:28技术图书徽章
日期:2013-12-11 09:26:39白羊座
日期:2013-12-27 15:27:13金牛座
日期:2014-01-06 09:13:05天蝎座
日期:2014-01-21 14:23:28酉鸡
日期:2014-05-09 16:51:12卯兔
日期:2014-08-11 16:49:1515-16赛季CBA联赛之八一
日期:2017-08-14 23:24:57
2 [报告]
发表于 2013-12-24 14:14 |只看该作者
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. while (<DATA>) {
  5.         chomp;
  6.         my @data = split /\s+/;
  7.         for (my $m=0;$m<=@data-4;$m++) {
  8.                 my $seq = $data[$m]+$data[$m+1]+$data[$m+2]+$data[$m+3];
  9.                 my $aver = $seq/4;
  10.                 print "$m\t$seq\t$aver\n";
  11.         }
  12. }



  13. __DATA__
  14. 1 1 1 1 -1 1 1 1 1 -1 1
复制代码
这和kmer这个概念很像···
程序很简陋,不过能用。

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
3 [报告]
发表于 2013-12-24 14:29 |只看该作者
  1. #!/usr/bin/perl
  2. use 5.010;

  3. my @data = split /\s+/, <DATA>;
  4. my $n = 0;
  5. while ( $#data >= 4 ) {
  6.         say ++$n, '--', $n+3, ' ', ($data[0]+$data[1]+$data[2]+$data[3])/4;
  7.         shift @data;
  8. }

  9. __DATA__
  10. 1 1 1 -1 1 1 1 1 -1 1 1 -1 -1 1 -1 1 1 -1 -1 1 1 1 1 1 1 -1 1 1 1 1 1 -1 -1 1 1 -1 1 1 1 -1 1 1 1 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 1 1 1 1 1 1 -1 1 -1 1 -1 1 1 1 1 1 1 -1 -1 1 1 1 1 -1 1 -1 -1 -1 1 1 1 1 1 1 -1 1 1 1 1 1 -1 1 1 1 1 1 1 1 -1 -1 1 1 1 -1 -1 1 1 -1 -1 -1 1 1 -1 1 1 1 1 -1 1 -1 1 -1 1 1 -1 -1 1 1 1 1 1 1 1
复制代码

论坛徽章:
0
4 [报告]
发表于 2013-12-24 14:38 |只看该作者
这个更像perl程序.!回复 3# yestreenstars


   

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
5 [报告]
发表于 2013-12-24 14:38 |只看该作者
小伙伴们, 这个高端大气上档次。{:2_179:}
  1. #!/usr/bin/perl -w
  2. my $s = <DATA>;
  3. print +( 4 - tr/-// * 2 ) / 4 . ' ' for $s =~ /(?:\S+\s*){4}/g;

  4. __DATA__
  5. 1 1 1 -1 1 1 1 1 -1 1 1 -1 -1 1 -1 1 1 -1 -1 1 1 1 1 1 1 -1 1 1 1 1 1 -1 -1 1 1 -1 1 1 1 -1 1 1 1 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 1 1 1 1 1 1 -1 1 -1 1 -1 1 1 1 1 1 1 -1 -1 1 1 1 1 -1 1 -1 -1 -1 1 1 1 1 1 1 -1 1 1 1 1 1 -1 1 1 1 1 1 1 1 -1 -1 1 1 1 -1 -1 1 1 -1 -1 -1 1 1 -1 1 1 1 1 -1 1 -1 1 -1 1 1 -1 -1 1 1 1 1 1 1 1
复制代码

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
6 [报告]
发表于 2013-12-24 14:47 |只看该作者
回复 5# pitonas
小伙伴你算出来的好像有问题~

   

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
7 [报告]
发表于 2013-12-24 14:54 |只看该作者
{:2_177:} 大神
0.5 1 0 0 0 1 0.5 0.5 0 0.5 1 -0.5 -0.5 0 0 1 0.5 0 1 0 1 -0.5 0.5 0.5 1 0.5 1 0 0 0 0 1 0 0 0.5 1

1 1 1 -1   0.5
1 1 1 1    1
-1 1 1 -1  0
-1 1 -1 1  0
1 -1 -1 1  0
1 1 1 1    1
.....
回复 6# yestreenstars


   

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
8 [报告]
发表于 2013-12-24 15:08 |只看该作者
没注意到  1--4, 2--5 {:2_172:} 是有问题

回复 6# yestreenstars


   

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
9 [报告]
发表于 2013-12-24 15:29 |只看该作者
小伙伴们, 这个正确了 {:2_172:}
  1. #!/usr/bin/perl -w
  2. my @s = map split, <DATA>;
  3. print +( 4 - "@s[$_..$_+3]" =~ tr/-// * 2 ) / 4, " " for 0 .. @s - 4;

  4. __DATA__
  5. 1 1 1 -1 1 1 1 1 -1 1 1 -1
复制代码

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
10 [报告]
发表于 2013-12-24 16:48 |只看该作者
回复 1# liujie126

The other way to assign average number by call

use strict;
use warnings;

sub avg{
  my($sAvg, @aData) = @_;
  my @aRet;
  my $sTotal = 0;

  return if(@aData < $sAvg);   # check it

  $sTotal += $aData[$_]  foreach(0 .. $sAvg-2);   # precalculate the total without last one [0,1,2]
  foreach(0 .. @aData-$sAvg){
    $sTotal += $aData[$_ + $sAvg-1];                  # summary with last one [0,1,2,3]
    push @aRet, $sTotal/$sAvg;                            # to get average
    $sTotal -= $aData[$_];                                   # remove the first one [1,2,3]
  }
  return @aRet;
}
while(<DATA>){
  chomp;
  my @aData = split;
  my @aAvg = avg(4,@aData);
  print "@aAvg\n";
}

__DATA__
1 1 1 -1 1 1 1 1 -1 1 1 -1 -1 1 -1 1 1 -1 -1 1 1 1 1 1 1 -1 1 1 1 1 1 -1 -1 1 1 -1 1 1 1 -1 1 1 1 1 -1 -1 1 -1 -1 -1 1 -1 1 -1 -1 1 1 1 -1 -1 1 1 1 1 1 1 1 -1 1 -1 1 -1 1 1 1 1 1 1 -1 -1 1 1 1 1 -1 1 -1 -1 -1 1 1 1 1 1 1 -1 1 1 1 1 1 -1 1 1 1 1 1 1 1 -1 -1 1 1 1 -1 -1 1 1 -1 -1 -1 1 1 -1 1 1 1 1 -1 1 -1 1 -1 1 1 -1 -1 1 1 1 1 1 1 1
1 1 1 1 -1 -1 -1 -1

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP