Chinaunix

标题: 急!如何从一个文件里的名字提取另一个文件相对应的部分 [打印本页]

作者: juzi1114    时间: 2008-07-09 17:06
标题: 急!如何从一个文件里的名字提取另一个文件相对应的部分
不好意思,各位 又来打扰了,现在比较急拉,帮我看看这个程序吧,现在我有两个文件,1.txt 和2.txtt
我的编码如下:
#!/usr/bin/perl -w
open(FILE1,"<1.txt" || die"$!";
open(FILE2,"<2.txt" || die "$!";
open(FILE_OUT,">3.txt" || die "$!";
@array =<FILE2>;
close (FILE2);
foreach $name(@array)
{
chomp($name);
$flag =0;
        while(<FILE1>
        { chomp;
                if($_=~ /^>/)
                {
                  if($_=~ /$name\|(.*)/){
                   print FILE_OUT $_,"\n";
                $flag =1;
                   }
                        else
                        {next;}
                }
                else
                {
                        if($flag ==1){
                        print FILE_OUT $_,"\n";}
                       
               
                }


        }
}
close(FILE_OUT);
close(FILE1);


我是想要用2.txt里的名字去提取文件1.txt里的序列,但是弄了好久都出错,麻烦帮我看看吧  谢谢拉 ....

[ 本帖最后由 juzi1114 于 2008-7-10 10:34 编辑 ]

存档文件 1.rar

3 KB, 下载次数: 33


作者: forlorngenius    时间: 2008-07-09 17:09
if (m/$name(.*)){


here
作者: juzi1114    时间: 2008-07-09 17:33
标题: 回复 #2 forlorngenius 的帖子
是我不小心掉了 已经改过来了
作者: juzi1114    时间: 2008-07-10 11:55
我重新修改了下,你们谁有时间帮我看下吧 55... 谢谢啦!!
作者: cobrawgl    时间: 2008-07-10 12:14
你举个例子,你想做什么(提取哪部分)
作者: juzi1114    时间: 2008-07-10 12:30
标题: 回复 #5 cobrawgl 的帖子
从第2个文件中由每一行提取相应的部分 如由
>P30443这一行来提取另外一个文件中所对应的序列
>P30443|1A01_HUMAN HLA class I histocompatibility antigen, A-1 alpha chain precursor - Homo sapiens (Human)
MAVMAPRTLLLLLSGALALTQTWAGSHSMRYFFTSVSRPGRGEPRFIAVGYVDDTQFVRF
DSDAASQKMEPRAPWIEQEGPEYWDQETRNMKAHSQTDRANLGTLRGYYNQSEDGSHTIQ
IMYGCDVGPDGRFLRGYRQDAYDGKDYIALNEDLRSWTAADMAAQITKRKWEAVHAAEQR
RVYLEGRCVDGLRRYLENGKETLQRTDPPKTHMTHHPISDHEATLRCWALGFYPAEITLT
WQRDGEDQTQDTELVETRPAGDGTFQKWAAVVVPSGEEQRYTCHVQHEGLPKPLTLRWEL
SSQPTIPIVGIIAGLVLLGAVITGAVVAAVMWRRKSSDRKGGSYTQAASSDSAQGSDVSL
TACKV
作者: cobrawgl    时间: 2008-07-10 12:51
#!/usr/bin/perl

use strict;
use warnings;

my $file1 = '1.txt';
my $file2 = '2.txt';


open FILE_1, $file1
    or die;

open FILE_2, $file2
    or die;

my @data = <FILE_1>;
my $data = join '', @data;

while (<FILE_2>) {
        print;
        chomp;
    print $1 if $data =~ /($_.*?)>/ms;
}


__________________________

先给你个能用的,版主有个更好的解决办法,可惜我还没学会
作者: juzi1114    时间: 2008-07-10 13:20
标题: 回复 #7 cobrawgl 的帖子
呵呵 非常感谢了啊 真的是感激涕零啊 哈哈.... 我从昨天弄到现在 就这一个快把我弄晕了 原来这样看起来的话不是很难 就是我想的逻辑太复杂了,谢谢  好崇拜你们啦 呵呵.... 多向你们学习了!!!
作者: juzi1114    时间: 2008-07-10 13:32
标题: 回复 #7 cobrawgl 的帖子
呵呵 有个地方不是很懂啦 就是my $data = join '', @data; 这一句是把整个文件都变为一行了吗? 那后面出来的结果怎么按照以前的格式来分行的???
作者: forlorngenius    时间: 2008-07-10 13:33
原帖由 juzi1114 于 2008-7-10 13:20 发表
呵呵 非常感谢了啊 真的是感激涕零啊 哈哈.... 我从昨天弄到现在 就这一个快把我弄晕了 原来这样看起来的话不是很难 就是我想的逻辑太复杂了,谢谢  好崇拜你们啦 呵呵.... 多向你们学习了!!!



花点时间把programming perl的正则表达那章好好看看就能解决了。
作者: forlorngenius    时间: 2008-07-10 13:36
**

[ 本帖最后由 forlorngenius 于 2008-7-10 17:01 编辑 ]
作者: juzi1114    时间: 2008-07-10 13:43
标题: 回复 #10 forlorngenius 的帖子
好的 一定会去看看的 呵呵 谢谢!
作者: juzi1114    时间: 2008-07-10 13:45
标题: 回复 #11 forlorngenius 的帖子
不改结果就可以出来了的,谢谢你的建议哦!!
作者: forlorngenius    时间: 2008-07-10 13:48
标题: 回复 #13 juzi1114 的帖子
我写的那个只是 在文件当中有重复头的情况,能全部找出来,
比如有两个或以上的  >P30443
作者: juzi1114    时间: 2008-07-10 14:09
标题: 回复 #14 forlorngenius 的帖子
哦 这样的啊 呵呵 知道啦...
作者: juzi1114    时间: 2008-07-10 15:43
标题: 回复 #7 cobrawgl 的帖子
呵呵 谢谢啦 可是中间又出现问题了,还有一个文件 类似文件1,里面的名字是以这样的形式开头的:
>gi|4504595
>gi|153946395
>gi|23397689
>gi|14165400
>gi|46094076
>gi|23097238
可是出来结果都成了这样的了:
4504595|ref|NP_002166.1| interferon, alpha 21 [Homo sapiens]

153946395|ref|NP_002151.2| tenascin C precursor [Homo sapiens]
然后文件提示说为二进制文件,把前面的>gi| 都给去掉了,我不知道原因是为什么啊....
作者: forlorngenius    时间: 2008-07-10 16:01
标题: 回复 #16 juzi1114 的帖子
发现个问题,前不久lz发了个类似的帖子,flw给出了通用解,而你又发贴,难道你天天要用到perl,却不系统的学习,就指望靠发贴来学习??

http://bbs.chinaunix.net/thread-1165378-1-4.html
作者: juzi1114    时间: 2008-07-10 16:47
标题: 回复 #17 forlorngenius 的帖子
***

[ 本帖最后由 juzi1114 于 2008-7-11 08:09 编辑 ]
作者: juzi1114    时间: 2008-07-10 16:53
标题: 回复 #17 forlorngenius 的帖子
***

[ 本帖最后由 juzi1114 于 2008-7-11 08:08 编辑 ]
作者: flw    时间: 2008-07-10 17:13
学习要系统,要虚心。
楼主再这样子,我就不喜欢了哦。
作者: ganer    时间: 2008-07-10 17:28
测试
作者: hdc1112    时间: 2008-07-10 20:21
join ",@data是什么意思,这句有语法错误吧。。

本意是不是忽略\n回车符,把一段内容送入$data?
print $1 if $data =~ /($_.*?)>/ms;
是不是跟这里有关,加了个/m参数表示把忽略了回车符的一段内容重新恢复回车符?
作者: juzi1114    时间: 2008-07-11 08:10
标题: 回复 #20 flw 的帖子
恩 好




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2