V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
imlm
V2EX  ›  问与答

提取两个文件中的数据,并把完整格式存储到一个新的文件中

  •  
  •   imlm · 2019-11-24 17:17:07 +08:00 · 954 次点击
    这是一个创建于 1631 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我有两个文件 第一个是包含 unigene 序号的文件,名称为一个序号一行

    CL79.Contig98_All

    Unigene56947_All

    CL323.Contig1_All

    另一个文件里面是 All-Unigene.fa 的文件,里面数据很大,其中第一个文件的序号以及对应的序列在 All-Unigene.fa 可以找到格式为.fa 格式,如下所示

    CL323.Contig1_All CTTTTTTCCAGGGAGGTGGCAGCAGTCTACGTGCTCGTTATGATCGTTTG GAATGACAAATATTTTGCAAATACTGTGGGTTTCTGTGGAATAACCTTGC TTGATTTTGCAGGTTAAACCAGCTGCAGCTGGTTTTGTTTAACACATTGT TCTCTTTCTGTAGATAGAAACAACCATG

    CL447.Contig1_All AGAGAAACCTGGTCAGTTGGCTGGAGGTTTCAGCCAGAGAAGGTCTTTTA TACTGTTGTATTTGAATTTTGTGCACTTAGGCTGACTCTTCCTCTGTGTG CTGTAGGATGGAGGTGTCCTGCCTGGAGCTGGCGTTGGAGGGTGAGCGGC TCTGTAAGGTGGGCGACTACAGAGCAGGCGTCTCCTTCTTTGAAGCCGCC ATCCAGGTGGGCACAGAGGACCTGCAGGTGCTAAGTGC

    我想要通过序号文件找到它在 All-Unigene.fa 文件查找到对应的序列,然后把 All-Unigene.fa 中的完整的一条输入新建的文件里面。

    实验室最近新开始搞一部分生物信息的东西,零基础开始学习,头秃,请大神帮助。

    11 条回复    2019-11-26 10:12:20 +08:00
    crella
        1
    crella  
       2019-11-25 00:56:06 +08:00 via Android
    你至少要说明用什么语言啊,要不然怎么给代码?按你的描述我觉得还不太难。
    crella
        2
    crella  
       2019-11-25 01:17:06 +08:00 via Android
    https://paste.ubuntu.com/p/kv5fYY9vhH/
    理想情况可以这样。要想处理好异常,又要跑得快,就得改改。
    crella
        3
    crella  
       2019-11-25 01:21:13 +08:00 via Android   ❤️ 1
    imlm
        4
    imlm  
    OP
       2019-11-25 07:24:10 +08:00
    语言,这个倒是无所谓,自己用 Perl 弄了一个,不过感觉很差,而且不知道哪里错误了,反正没有能够出来。
    #!/usr/bin/perl
    use strict;
    my %hash=();
    open list,"<$ARGV[0]";
    while (<list>){
    chomp;
    $hash{$_}=1; #先把需要的序列 id 放到哈希表中,id 是键所有值都设为 1
    }
    close list;

    open unigene,"<$ARGV[1]";
    $/=">";
    <unigene>;
    while (<unigene>){
    chomp;
    my $ID=(split /\n/,$_,2)[0]; #分割成两部分,以大于号为分割点,分成 id 和序列.
    if (exists $hash{$ID}){ #用 exists 函数判断当前 id 在哈希键是否存在,存在输出 id 与序列,否则下一步
    print ">$_\n";
    }
    else{
    next;
    }

    }
    close unigene;
    imlm
        5
    imlm  
    OP
       2019-11-25 07:24:35 +08:00
    话说谢谢你们的帮助。
    crella
        6
    crella  
       2019-11-25 08:25:28 +08:00 via Android
    perl 对于多行同时读入文本,反正我是搜索不到好的方法。隔壁 ruby 可以 readlines 一次性读取所有行并切割为数组,又可以 while line = fileio.gets,逐行读取。真香。perl 好多东西搜不到啊。
    imlm
        7
    imlm  
    OP
       2019-11-25 16:23:40 +08:00
    @crella 不清楚为什么,你的两个脚本在同一个地方报错了...
    syntax error, unexpected '|', expecting ')'
    serials.each( |cur_serial|

    syntax error,unexpected tSTRING_DEND, expecting keyword_end
    syntax error,unexpected end-of-input, expecting keyword_end
    serial_processor()
    imlm
        8
    imlm  
    OP
       2019-11-25 16:39:44 +08:00
    @crella 修复之后运行,不是很明白为什么一运行直接就结束了,很快的那种,然后也没有什么文件生成或者改变...
    crella
        9
    crella  
       2019-11-25 19:51:43 +08:00
    @imlm 不好意思啊,昨晚没电脑,手机码的。把 serials.each( |cur_serial| 的(改成{,即大括号。
    要不你把示例数据压缩包上传网盘,我再测试一下?
    crella
        10
    crella  
       2019-11-25 19:59:46 +08:00
    额,电脑才看明白你的生物序列之间是空格还是换行……
    imlm
        11
    imlm  
    OP
       2019-11-26 10:12:20 +08:00 via Android
    @crella 已经可以了,自己修改了一下,嘿嘿,谢啦。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2874 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:03 · PVG 20:03 · LAX 05:03 · JFK 08:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.