免费注册 查看新帖 |

Chinaunix

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

跪求高手帮助解决perl问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-12-08 21:51 |只看该作者 |倒序浏览
本帖最后由 弦断有谁听1053476508 于 2014-12-15 16:53 编辑

任务:步骤1,Orthologs-msu.txt是原始文件,让其每一行行生成1个ID文件(如ORTHOMCL2.txt) ,文件名是每一行第一个元素。
        步骤2,然后以文件名为散列的key,文件内容为元素构造散列保存。
        步骤3,再用每个ID文件的每一行(如下面的APK_ORTHOMCL2),从同一个Allseq.fa(DNA文件)中找到对应的APK_ORTHOMCL2提取DNA序列
如,APK_ORTHOMCL2
>AT1G51370.2 | Symbols:  | F-box/RNI-like/FBD-like domains-containing protein | chr1:19045615-19046825 FORWARD LENGTH=1118
ATGGTGGGTGGCAAGAAGAAAACCAAGATATGTGACAAAGTGTCACATGAGGAAGATAGGATAAGCCAGTTACCGGAACC
TTTGATATCTGAAATACTTTTTCATCTTTCTACCAAGGACTCTGTCAGAACAAGCGCTTTGTCTACCAAATGGAGATATC
TTTGGCAATCGGTTCCTGGATTGGACTTAGACCCCTACGCATCCTCAAATACCAATACAATTGTGAGTTTTGTTGAAAGT
TTTTTTGATTCCCACAGGGATTCATGGATACGCAAACTCCGTTTAGATTTGGGTTATCATCATGATAAGTATGATCTCAT
GTCATGGATTGATGCTGCGACTACGCGTAGGATTCAGCATCTTGATGTTCATTGTTTTCACGATAATAAGATACCCTTGA
GCATATATACATGCACGACGTTGGTACACTTACGACTCCGTTGGGCTGTCTTGACTAATCCCGAGTTTGTTTCCTTACCT

生成N个fa序列文件,找不到对应ID的生产空文件。

原始文件就像下面的内容:
orthologous_group_ID num_orthologs/in-paralogs num_species species orthologs/in-paralogs
APK_ORTHOMCL0 416 2 rice sorghum LOC_Os04g04140 LOC_Os05g29160 LOC_Os10g02640  
APK_ORTHOMCL2 212 3 brachy rice sorghum Bradi1g21530 Bradi2g26540 Bradi2g49480 Bradi2g61260

其中要求生成的ID文件如下:
APK_ORTHOMCL0
416
2
rice sorghum
LOC_Os04g04140
LOC_Os05g29160
LOC_Os10g02640

别人写的步骤一的一段代码,错误出在哪,怎么改?或者高手给重写一段。
open (IN,"<$ARGV[0]");
my ($i,@in,$linename,@id);
while (<IN>)
  {
@in = split("\s", $_);
$linename = shift (@in);
@id = join ("\n", @in);
print "$linename\n@id";
$i++;
open my $out, ">$i";
print $out sth

步骤二没有参考脚本

步骤三的参考脚本如下:
#tempo 从fasta格式中用名称提取序列
#cd C:\strawberry\perl\bin
# perl ID-SEQok.pl ORTHOMCL2.txt zmossbat.fa >mcl2.fa
#!/usr/bin/perl -w
#use strict;
#use warnings;
($ARGV[0] && $ARGV[1]) or die "usage: $0 NameFile DataBase\nShortName to FullName\n";
my $nameFile=$ARGV[0];
my $dataFile=$ARGV[1];
open(my $nf,$nameFile) or die "cannot open $nameFile";
open(my $df,$dataFile) or die "cannot open $dataFile";
undef $/;
my $temp;
$temp=<$nf>;
my @names=sort split /\n/,$temp;
close($nf);
foreach my $name (@names)
{
    $name=~s/\|/\\|/g;
}
$/=">";
while($temp=<$df>)
{
    chomp($temp);
    $temp=~m/(.*)/;
    my $head=$1;
    foreach my $name(@names)
    {
        if($head=~m/$name/i)
        {
            print ">$temp";
        }
    }
}
close($df);

我是植物学硕士,但是对计算机语言没什么造诣,高手帮帮忙吧,最好把三个步骤连在一起写一个程序。  
---------------------------------------------------------------------------------------------------------------------------------------------------------

12月15编辑:
  原始文件(Orthologs-msu.txt有约2000行)和要求生成约2000个fa序列文件,过程如


  Allseq.fa文件有200g,太大没法上传,只能发测试文件。测试文件在下面的附件中,具体测试就是使原始文件Orthologs-msu.txt每一行生成1个ID文件,文件名是每一行第一个元素,文件内容为ID。ID文件的每一行为一个子ID(如ORTHOMCL2.txt),再用每个ID文件的每一行(如下面的LOC_Os04g04140),从同一个Allseq.fa(DNA文件)中找到对应的(如LOC_Os04g04140)提取序列,生成N个fa序列文件。效果如APK_ORTHOMCL0.fa和APK_ORTHOMCL2.fa,提取不到对应序列的如APK_ORTHOMCL1.fa为空! 测试文件(12月15).zip (17.53 KB, 下载次数: 4)

测试文件和初步测试结果.zip

74.24 KB, 下载次数: 7

Orthologs-msu.zip

813.47 KB, 下载次数: 19

论坛徽章:
0
2 [报告]
发表于 2014-12-08 22:04 |只看该作者
大神进来看看吧

论坛徽章:
0
3 [报告]
发表于 2014-12-08 22:05 |只看该作者
身边的人都解决不了

论坛徽章:
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亚冠之平阳省
日期:2015-11-08 16:27:53白银圣斗士
日期:2015-11-14 09:58:12
4 [报告]
发表于 2014-12-09 21:04 |只看该作者
后面一步用BioPerl模块就好了

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
5 [报告]
发表于 2014-12-09 21:50 |只看该作者
回复 1# 弦断有谁听1053476508


    希望帮到你~
  1. #! /usr/bin/perl -w
  2. use File::Basename;
  3. die "\tperl $0 Orthologs-msu.txt Allseq.fa\n" unless scalar @ARGV eq 2;
  4. my($id_file, $fasta) = @ARGV;
  5. my %hash;

  6. open IN,"< $id_file" or die "$!";
  7. <IN>;
  8. open OUT,"> $id_file\.id" or die "$!";
  9. while(<IN>){
  10.         chomp;
  11.         my $key = (split)[0];
  12.         unless(exists $hash{$key}){
  13.                 print OUT $key.$/;
  14.                 open my $f, '>', "$id_file\.$key" ;
  15.                 $hash{$key} = basename($id_file);
  16.                 $file{$key} = $f;
  17.                 print { $file{$key} } ">".$key."\n";
  18.         }
  19. }
  20. close IN;
  21. close OUT;
  22. $/=">";
  23. open FASTA,"< $fasta" or die "$!";
  24. <FASTA>;
  25. while(<FASTA>){
  26.         chomp;
  27.         my($key,@value) = (split /\n/);
  28.         next unless exists $hash{$key};
  29.         print { $file{$key} } join("\n",@value);
  30. }
  31. close $hash{$_} for keys %hash;
  32. $/="\n";       
复制代码

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
6 [报告]
发表于 2014-12-09 21:50 |只看该作者
本帖最后由 huang6894 于 2014-12-09 21:51 编辑

回复 1# 弦断有谁听1053476508


    希望帮到你~
  1. #! /usr/bin/perl -w
  2. use File::Basename;
  3. die "\tperl $0 Orthologs-msu.txt Allseq.fa\n" unless scalar @ARGV eq 2;
  4. my($id_file, $fasta) = @ARGV;
  5. my %hash;

  6. open IN,"< $id_file" or die "$!";
  7. <IN>;
  8. open OUT,"> $id_file\.id" or die "$!";
  9. while(<IN>){
  10.         chomp;
  11.         my $key = (split)[0];
  12.         unless(exists $hash{$key}){
  13.                 print OUT $key.$/;  #第一题
  14.                 open my $f, '>', "$id_file\.$key" ;
  15.                 $hash{$key} = basename($id_file); #第二题
  16.                 $file{$key} = $f;
  17.                 print { $file{$key} } ">".$key."\n";
  18.         }
  19. }
  20. close IN;
  21. close OUT;
  22. $/=">";
  23. open FASTA,"< $fasta" or die "$!";
  24. <FASTA>;
  25. while(<FASTA>){
  26.         chomp;
  27.         my($key,@value) = (split /\n/);
  28.         next unless exists $hash{$key};
  29.         print { $file{$key} } join("\n",@value);#第三题
  30. }
  31. close $hash{$_} for keys %hash;
  32. $/="\n";       
复制代码
不好意思,重复发贴了

论坛徽章:
0
7 [报告]
发表于 2014-12-11 13:02 |只看该作者
谢谢你 我试下回复 5# huang6894


   

论坛徽章:
0
8 [报告]
发表于 2014-12-12 22:40 |只看该作者
回复 5# huang6894

测试用的附件和初步测试结果我已经上传,还要麻烦您看下,有几个问题

1 为何生成的.APK文件(应该是最终的结果.fa)为空?
2 模块file::basename如何用?
3  命令行输入的有没有问题?

论坛徽章:
0
9 [报告]
发表于 2014-12-12 22:42 |只看该作者
回复 4# b114213903
那是什么,不懂。若是我生成散列后怎么操作,还请指导


   

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
10 [报告]
发表于 2014-12-13 10:56 |只看该作者
我很想帮你,但是

你就不能给点真实数据麽~程序我没看出来有什么问题,菜鸟写法,不追求技巧~
basename是一个模块,用来获取一个输入的(如:c:\\hh\\tt)最后那个名称,也就是文件名tt
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP