免费注册 查看新帖 |

Chinaunix

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

亲:帮我改个简单程序~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-09 18:17 |只看该作者 |倒序浏览
本帖最后由 lijie_perl 于 2011-12-09 23:09 编辑

有2文件(见附件)
file1:
24523行(代表24523个样本,样本编号没有给出,默认按行依次编号)。每行39列且严格tab键分开,数值不是0就是1。

file2:
7628行(每一行代表一个聚类,每一行中得数代表file1中每一个样本的编号,空格分开)

现在读取file2中得每一行(即相同的一个聚类),并根据这一行的样本编号去file1查找出这个样本。并将此行所有样本“按列”求和。


最后输出应该是一个 7628*39的矩阵才对呀。为什么我的只有7628*3呀?每列还数值一样?明显不对~
我不知道程序错在哪里了?
  1. #!/usr/bin/perl -w
  2. use strict;
  3. my %hash1;
  4. my $index=1;
  5. my @sum=0;
  6. open (IN1,"file1.txt");
  7. while ( <IN1> )
  8. {
  9.         $hash1{$index}=$_;
  10.         $index++;
  11. }
  12. close(IN1);

  13. open (IN2,"file2.txt");
  14. open OUT,">result.txt";
  15. while ( <IN2> )
  16. {
  17.                 my $i;
  18.                 my @line;
  19.                 my @sample = split;
  20.                         foreach my $item (@sample) {
  21.                                 @line= split("\t", $hash1 {$item});
  22.                                 for ($i=0,$i<$#line,$i++) {
  23.                                         $sum[$i] += $line[$i];
  24.                                 }
  25.                         }

  26.                         for ($i=0,$i<$#sum,$i++) {
  27.                                 print  OUT $sum[$i], "\t";
  28.                         }
  29.                         print OUT "\n";
  30. }
  31. close(IN2);
  32. close OUT;
复制代码

data.zip

216.81 KB, 下载次数: 29

data.zip

216.81 KB, 下载次数: 36

论坛徽章:
0
2 [报告]
发表于 2011-12-09 18:25 |只看该作者
本帖最后由 twilightagain 于 2011-12-09 18:26 编辑

m/(.*)\t(\d+)$/ 有问题

*默认贪婪匹配,试试这个:

m/([^\t]*?)\t(\d+)$/

论坛徽章:
0
3 [报告]
发表于 2011-12-09 19:27 |只看该作者
本帖最后由 cobrawgl 于 2011-12-09 19:30 编辑

这样?
  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;

  4. open IN1, "file1.txt";
  5. my @data = <IN1> ;
  6. close IN1;

  7. open IN2, "file2.txt";
  8. open OUT, ">result.txt";
  9. while ( <IN2> ) {
  10.         chomp;
  11.         my @sum;
  12.         for my $item ( (split) ) {
  13.                 my @line = split /\t/, $data[$item];
  14.                 for (0..$#line) {
  15.                         $sum[$_] += $line[$_];
  16.                 }
  17.         }
  18.         print OUT join "\t", @sum;
  19.         print OUT "\n";
  20. }

  21. close IN2;
  22. close OUT;
复制代码
result.zip (63.35 KB, 下载次数: 20)

论坛徽章:
0
4 [报告]
发表于 2011-12-09 23:13 |只看该作者
这样?
cobrawgl 发表于 2011-12-09 19:27



呵呵,谢谢~

同时,发现以前上传的程序有一个小错误~
已经在上面修改了~
(不过已经被你改过来了)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP