免费注册 查看新帖 |

Chinaunix

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

关于Perl两个文件的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-04-28 18:06 |只看该作者 |倒序浏览
要求是文件1.格式是这个样子,碱基数目很大,chr到12,碱基序列很长我就省略了
>chr01
nnnnagtacgt.....
>chr02
nnnnnggtaa....
.......
文件2 格式如下,这个只是众多数据中的一个而已,大约是这种感觉
chr01 irgsp1_rep CDS 17383 17474 . + . Parent=Os01t0100500-01

其中,文件2的意思是,在chr01 染色体上,Os01t0100500-01是基因片段名称,17383 17474 代表这个基因片段处于第几个碱基到第几个碱基的范围。
要求是,文件2 得到的碱基范围在文件1中找到对应的碱基序列并输出到新文件,同时要求标注上基因片段名称,该怎么处理,求大神指点
期望结果是这样子的
>Os01...
acgt....
>Os01...
gtac.....

论坛徽章:
0
2 [报告]
发表于 2015-04-30 15:35 |只看该作者
是新手,刚刚学习
大约是这样子的这种感觉

open...
open...
my %hash;
while(...){...}
while(...){...}

论坛徽章:
0
3 [报告]
发表于 2015-04-30 18:32 |只看该作者
我也是新手啊,看不懂啊回复 2# ba_du_co


   

论坛徽章:
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 [报告]
发表于 2015-04-30 20:32 |只看该作者
1、仔细学习FASTA格式规范
2、学习一下“文件句柄”和substr操作

应该就要以了

论坛徽章:
0
5 [报告]
发表于 2015-05-05 22:42 |只看该作者
这个感觉有点太过抽象啊回复 2# ba_du_co


   

论坛徽章:
0
6 [报告]
发表于 2015-05-11 11:07 |只看该作者
回复 5# 小丽子酱

doc1.txt

>chr01
nnnnagtacgt
>chr02
nnnnnggtaa
>chr03
nnnnnnnnggtaannggtaa

doc2.txt

chr01 irgsp1_rep CDS 3 5 . + . Parent=Os01
chr02 irgsp2_rep CDS 2 6 . + . Parent=Os02
chr03 irgsp3_rep CDS 1 3 . + . Parent=Os03

结果大约是这样子

>Os01
nag
>Os02
nnngg
>Os03
nnn

代码大约是这样子

第一个open...
...大约是这种感觉的代码

  my $doc1, 'doc1.txt';

第二个open...
...大约是这种感觉的代码

  my $doc2, 'doc2.txt';

第一个while(...){...}
第一个...大约是这种感觉的代码

<$doc2>

第二个...大约是这种感觉的代码

    my ( $chr, $parent, @range ) = (split)[ 0, 8, 3, 4 ];
    $hash{$chr} = [ ( split '=', $parent )[1], @range ];

第二个while(...){...}
第一个...大约是这种感觉的代码

<$doc1>

第二个...大约是这种感觉的代码

    my ($chr) = /^>(\S+)/;
    unless ( exists $hash{$chr} ) { <$doc1>; next }
    chomp( my $atcg = <$doc1> );
    my ( $parent, $position1, $position2 ) = @{ $hash{$chr} };
    say '>', $parent;
    say substr $atcg, $position1, $position2 - $position1 + 1;




   

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2015-09-20 06:20:00
7 [报告]
发表于 2015-05-13 09:24 |只看该作者
say是怎么用的,求解回复 6# ba_du_co


   

论坛徽章:
0
8 [报告]
发表于 2015-05-13 12:40 |只看该作者
感谢大大,想要的就是这种结果,但是大大可以详细点吗?作为一个新手,我貌似找不到那种感觉QAQ回复 6# ba_du_co


   

论坛徽章:
0
9 [报告]
发表于 2015-05-18 10:29 |只看该作者
#!/usr/bin/perl -w

use strict ;

my $DOC1 ;
my $DOC2 ;
my $DOC3 ;
my $file1 = "./doc1.txt" ;
my $file2 = "./doc2.txt" ;
my $file3 = "./doc3.txt" ;

my %doc1_hash ;
my $doc1_val ;
my @doc2_list ;

open $DOC1, '<', $file1 or die "Can't open doc1.txt" ;

while( <$DOC1> ) {
        chomp( $_ ) ;
        if(        m/>/ ) {
                $doc1_val = substr( $_, 1 ) ;
                #print "$doc1_val \n" ;
        }
        else {
                $doc1_hash{$doc1_val} = $_ ;
        }
}

close( $DOC1 ) ;

### 采取追加的方式写到doc3,避免重复写入,先把当前文件重命名 ###
if( -e $file3 ) {
        rename $file3, $file3."_bak" ;
}

open $DOC2, '<', $file2 or die "Can't open doc2.txt" ;
open $DOC3, '>>', $file3 or die "Can't open doc2.txt" ;

while( <$DOC2> ) {
        chomp( $_ ) ;
        @doc2_list = split/\s+/, $_ ;       
        foreach my $key ( keys %doc1_hash ) {
                if( $key eq $doc2_list[0] ) {
                        my $pos_start = $doc2_list[3] ;
                        my $len = $doc2_list[4] - $pos_start ;
                        my @tmp_list = split/=/, $doc2_list[6] ;
                        my $doc3_val = substr( $doc1_hash{$key}, $pos_start, $len+1 ) ;
                        print $DOC3 ">$tmp_list[1]\n$doc3_val\n" ;
                }
        }
}

close( $DOC2 ) ;
close( $DOC3 ) ;

我也是新手写了一个,功能照着你那个实现了,但是你提供的信息有限,不知道会不会有什么特殊情况,或者文件有没有特别的行之类的,你看看吧。

论坛徽章:
0
10 [报告]
发表于 2015-05-19 19:40 |只看该作者
回复 9# 程序猿zy


   非常感谢大大的编码,但是已经处理好了,我会好好看看大大的编码的,谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP