24小时热门版块排行榜    

查看: 1691  |  回复: 8

xiezhancnu

木虫 (小有名气)

[求助] perl程序求大神加以修改~~

现在有个文件夹TOTAL,该文件夹内有两个文件分别是a.txt和b.txt(见附件),我现在想生成这样的结果:
                  a.txt        b.txt(这一行可没有)
Os02t0249600-01        6236.420821        19861.20539
Os02t0242600-01                                      6550.062
Os03t0427300-01        7423.620595        26454.94742
Os01t0762500-00        5592.607026        31007.32272
第二行空格的意思是因为Os02t0242600-01在文件a.txt内没有对应的相,所以就空着!我现在写了一个程序,如下:
@gbk = glob('TOTAL/*');       
for($n=0;$n<=@gbk;$n++){
        open(input,"$gbk[$n]";       
        while(my $line={
     my @tmp=split("\t",$line);
     my $key = $tmp[0];  
     my $value = $tmp[4];  
     if (exists $hash{$key}){  
         $hash{$key} = $hash{$key}."\t".$value;  
     }else{
         $hash{$key} = $value;  
     }   
}
}       

delete $hash{GeneID};               
while(my($key,$value)=each %hash){
        print "$key\t$value\n";
}
生成的结果是这样的:
Os02t0249600-01        6236.420821        19861.20539
Os02t0242600-01        6550.062
Os03t0427300-01        7423.620595        26454.94742
Os01t0762500-00        5592.607026        31007.32272
也就是无法生成空格,第二行的6550.062应该在19861.20539这一列,请大神在我的 程序的基础上加以修改或者另写程序以实现我想要的结果,谢谢了~~~
回复此楼

» 本帖附件资源列表

  • 欢迎监督和反馈:小木虫仅提供交流平台,不对该内容负责。
    本内容由用户自主发布,如果其内容涉及到知识产权问题,其责任在于用户本人,如对版权有异议,请联系邮箱:xiaomuchong@tal.com
  • 附件 1 : a.txt
  • 2012-07-27 00:05:34, 740 bytes
  • 附件 2 : b.txt
  • 2012-07-27 00:05:48, 562 bytes

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wizardfan

至尊木虫 (著名写手)

优秀版主

【答案】应助回帖

★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
xzhdty: 金币+1, 谢谢参与 2012-07-28 00:01:13
xiezhancnu: 金币+5 2012-08-11 09:35:09
use strict;
#use Data:umper;
opendir DIR, "total";
my @files = readdir DIR;
closedir DIR;
my %hash;
#store all data into a big hash
foreach my $file(@files){
        next unless ($file=~/\.txt$/);#only deal with text file
        &dealOneFile($file);
}
#print Dumper(%hash);

#find the union set of all keys from all files
my %key;
my @doneFiles = keys %hash;
@doneFiles = sort {$a cmp $b} @doneFiles;#sort the file namess
foreach my $tmp(@doneFiles){
        my %oneFile = %{$hash{$tmp}};
#        print Dumper(%oneFile);       
        foreach (keys %oneFile){
                $key{$_}++
        }
}
#print Dumper(%key);

#print header
$"="\t";
print "file\t@doneFiles\n";
#print content
foreach my $key(keys %key){
        print "$key";
        foreach my $file(@doneFiles){
                print "\t";
                print "$hash{$file}{$key}" if (exists $hash{$file}{$key});
        }
        print "\n";
}

sub dealOneFile{
        my $filename = "$_[0]";
        open IN,"total/$filename";
        ; #remove header
        while(my $line={
                chomp($line);
                my ($key,$a,$b,$c,$value) = split("\t",$line);
                $hash{$_[0]}{$key}=$value;
        }
}
2楼2012-07-27 03:12:23
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zhusheng303

木虫 (小有名气)

【答案】应助回帖

感谢参与,应助指数 +1
有以个问题要问你?
你在处理这个事,最终是不是只有这两文件?
如果是,解决办法如下,
while(my $line={
     my @tmp=split("\t",$line);
     my $key = $tmp[0];  
     my $value = $tmp[4];  
     if (exists $hash{$key}){  
         $hash{$key} = $hash{$key}."\t".$value;  
     }else{
         $hash{$key} = “". "\t" .$value;  ####或者写成 “$hash{$key} = “-". "\t" .$value”,用“-”表示缺失数据
     }
积极面对
3楼2012-07-27 08:58:57
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zhusheng303

木虫 (小有名气)

【答案】应助回帖

如果超过3个文件,解决方法如下,
@gbk = glob('TOTAL/*');
my $hash; ##### 构建一个hash变量     
for($n=0;$n<=@gbk;$n++){
        open(input,"$gbk[$n]";        
        while(my $line={
                 my @tmp=split("\t",$line);
                 my $key = $tmp[0];  
                 my $value = $tmp[4];  
                 next if($key eq "GeneID";  #### 不记录“GeneID”这一行
                 $hash->{$key}{$n} = $value;  #### 每一个文件一个值
      }
}
my $fileNum=$#gbk;
foreach my $key (keys %{$hash}){
            print "$key";
            foreach my $i (0..$fileNum){
                       if(exists $hash->{$key}{$i}){
                                print "\t$$hash->{$key}{$i}";
                        }else{
                                print "\t";
                         }         
            }
            print "\n";

}
积极面对
4楼2012-07-27 09:26:47
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

xiezhancnu

木虫 (小有名气)

引用回帖:
4楼: Originally posted by zhusheng303 at 2012-07-27 09:26:47
如果超过3个文件,解决方法如下,
@gbk = glob('TOTAL/*');
my $hash; ##### 构建一个hash变量     
for($n=0;$n<=@gbk;$n++){
        open(input,"$gbk";        
        while(my $line=< ...

跑不通啊,你试试!!
5楼2012-07-27 10:18:20
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zhusheng303

木虫 (小有名气)

【答案】应助回帖


xzhdty: 金币+1, 谢谢 2012-07-28 00:00:57
我写了一个完整的perl脚本,具体见“parseFile.pl”(http://good.gd/2155638.htm),测试的结果见“结果.bmp”(http://good.gd/2155640.htm
"第二行空格的意思是因为Os02t0242600-01在文件a.txt内没有对应的相",你说a文件中没有“Os02t0242600-01”这行,但是,其实是有的,见图“文件a.bmp”(http://good.gd/2155643.htm)。

» 本帖已获得的红花(最新10朵)

积极面对
6楼2012-07-27 13:38:37
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wizardfan

至尊木虫 (著名写手)

优秀版主

【答案】应助回帖

引用回帖:
5楼: Originally posted by xiezhancnu at 2012-07-27 10:18:20
跑不通啊,你试试!!...

Have you tried my codes which can also allow multiple file processing? The commented-out print statements allow you to check the middle result.
7楼2012-07-27 23:28:31
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

xiezhancnu

木虫 (小有名气)

引用回帖:
3楼: Originally posted by zhusheng303 at 2012-07-27 08:58:57
有以个问题要问你?
你在处理这个事,最终是不是只有这两文件?
如果是,解决办法如下,
while(my $line=<input>{
     my @tmp=split("\t",$line);
     my $key = $tmp;  
     my $valu ...

有很多文件的!
8楼2012-07-28 22:09:12
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

xiezhancnu

木虫 (小有名气)

送鲜花一朵
引用回帖:
6楼: Originally posted by zhusheng303 at 2012-07-27 13:38:37
我写了一个完整的perl脚本,具体见“parseFile.pl”(http://good.gd/2155638.htm),测试的结果见“结果.bmp”(http://good.gd/2155640.htm)
"第二行空格的意思是因为Os02t0242600-01在文件a.txt内没有对应 ...

你好,呵呵,我之前把文件弄错了,呵呵,a文件,b文件的名字弄颠倒了,呵呵,另外a、b文件只是测试文件,总共有七个文件的,呵呵,我还没测试一下您的程序是否能跑通,送您鲜花一朵吧,呵呵,这样的话生成结果是这样的:
Os02t0249600-01        6236.420821        19861.20539
Os02t0242600-01                                    6550.062
Os03t0427300-01        7423.620595        26454.94742
Os01t0762500-00        5592.607026        31007.32272
这样也许您就不觉得奇怪了吧!
9楼2012-07-28 22:28:11
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 xiezhancnu 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[教师之家] 为什么余额宝的年化利率越来越低?主要原因有哪些? +3 瞬息宇宙 2026-08-15 3/150 2026-08-18 21:40 by xiaohuixin
[基金申请] 2027广东省杰青 +3 奶牛小黑 2026-08-15 9/450 2026-08-18 20:09 by 奶牛小黑
[基金申请] 朋友圈看到的 +4 wangzilk 2026-08-18 5/250 2026-08-18 19:25 by wangzilk
[基金申请] 欢迎发来filecode的Mz6后的代码验证其规律 +51 医学老男孩 2026-08-13 110/5500 2026-08-18 19:07 by icerianxia
[基金申请] 明天放榜? +5 Shxjjxjkx 2026-08-18 5/250 2026-08-18 18:14 by -大大大大大-
[基金申请] 重要消息,中午系统在维护 +9 yuleib84 2026-08-18 10/500 2026-08-18 16:52 by archvillain
[论文投稿] 投稿咨询 +4 wwm09 2026-08-17 6/300 2026-08-18 15:36 by wwm09
[基金申请] 时间戳又变了8-15 +14 archvillain 2026-08-15 26/1300 2026-08-18 13:37 by phantomgost
[基金申请] 今天维护系统维护 祝所有人 高中 +8 gjjjzhong 2026-08-18 9/450 2026-08-18 13:01 by 家与远方
[基金申请] 哪位老哥知道今年的国自然具体哪一天放榜? +13 Ldrop2023 2026-08-13 16/800 2026-08-18 12:25 by 淀粉搬运工
[基金申请] 快农历七夕节了,轻松一下,男人悄悄话,女施主请不要进来。 +4 Tide man 2026-08-14 5/250 2026-08-18 11:35 by Tide man
[基金申请] 93BebMhtakh前后11位开头都是大写 +4 且听虎啸 2026-08-17 5/250 2026-08-18 00:49 by 蔡棒棒菂
[基金申请] 感觉是下周放榜了 +6 angus9576 2026-08-17 11/550 2026-08-17 23:57 by angus9576
[基金申请] filecode=后面第一个是大写字母 +8 wangze12014 2026-08-14 10/500 2026-08-17 17:05 by xter9665
[基金申请] 今天系统多次维护,明天很可能放榜! +8 zju2000 2026-08-16 9/450 2026-08-17 12:20 by lmz0216
[精细化工] 招聘 金属平磨液,抛光液研发工程师 +3 小天0311 2026-08-14 3/150 2026-08-16 07:31 by H9PLUS
[基金申请] 重要来源:本周末出结果 +10 瞬息宇宙 2026-08-12 10/500 2026-08-13 15:46 by likettle
[基金申请] 不应该看fileCode +7 且听虎啸 2026-08-12 9/450 2026-08-13 14:27 by flydreamws
[基金申请] Filecode 又变了,巨变 +3 WH3796 2026-08-12 4/200 2026-08-13 14:13 by 小木虫6752397
[基金申请] 结合人工智能,周易传统文化,filecode打分制来了,3分以上希望很大。 +3 Tide man 2026-08-12 4/200 2026-08-13 08:35 by ZJTJZ
信息提示
请填处理意见