美文网首页Bioperl
perl脚本练习:fasta格式与tab格式序列之间相互转换(1

perl脚本练习:fasta格式与tab格式序列之间相互转换(1

作者: 学生信的大叔 | 来源:发表于2021-12-02 18:43 被阅读0次

    求关注

    如果觉得推文有用的话一定记得看下我的个人简介,关注下呀~

    前言

    seqkit 是序列处理的明星软件,里面的fx2tab与tab2fx功能是将fasta或者fastq格式文件与tab分割的格式的序列相互转换,还可以添加一些统计功能。今天用perl脚本实现下fasta格式与tab格式的相互转换功能。

    使用

    将fasta格式转换为tab分割

    perl  fa2tab.pl  -fa2tab  seqs.fa(input)  seqs.fa.tsv(output)
    

    将tab分割的文件转换为fasta格式

    perl fa2tab.pl -tab2fa  seqs.fa.tsv(input)  seqs.fa.tsv.fa(output)
    

    注意事项:脚本和输入文件只能放在当前目录。

    代码

    #!/usr/bin/env perl
    
    use strict;
    
    my $usage = "Usage:\nperl fa2tab.pl -fa2tab seqs.fa(input) seqs.fa.tsv(output)\nperl fa2tab.pl -tab2fa seqs.fa.tsv(input) seqs.fa.tsv.fa(output)\n";
    my $option = "$ARGV[0]";
    die "$usage" unless $option =~ /-fa2tab|-tab2fa/i;#注意优先级;新手写的,是不是很神奇;
    die "$usage" unless @ARGV == 3; #列表上下文
    
    if($option =~ /-fa2tab/i){
        open FA,"$ARGV[1]" || die "\nERROR: Couldn't open $ARGV[1] !\n";
        open TSV,'>',"$ARGV[2]"|| die "\nERROR: Couldn't create $ARGV[2] !\n";
        $/=">";
        while (<FA>){
            next unless (my ($id,$seq) = /(.*?)\n(.*)/s);#非贪婪匹配写法,匹配到第一个换行,之前为$id,之后序列为$seq;
            $seq =~ s/[\d\s>]//g; #第一个分隔符>没有,下面一个ID的>是在上一个序列的末尾,最后一个序列的序列末尾没有>;
            print TSV "$id\t";
            print TSV "$seq\n";
        }
    }elsif($option =~ /-tab2fa/){
        open TSV,"$ARGV[1]" || die "\nERROR: Couldn't open $ARGV[1] !\n";
        open FA,'>',"$ARGV[2]"|| die "\nERROR: Couldn't create $ARGV[2] !\n";
    
        while(<TSV>){
            next unless (my ($id,$seq) = /(.*?)\t(.*)/s);
            chomp $seq; #对于这么短的模块,这么写有点多余了;
            print FA ">$id\n$seq\n"; #不会整理序列长度,先这么写吧;
        } #应该不用写else了,前面已经限定了只有这两种情况才可执行;
    }
    
    close FA;
    close TSV;
    

    总结

    1. tab分割转换为fasta格式时暂时只能转换为单行序列模式;
    2. misa的p3_in.pl脚本没白看。

    相关文章

      网友评论

        本文标题:perl脚本练习:fasta格式与tab格式序列之间相互转换(1

        本文链接:https://www.haomeiwen.com/subject/zucuxrtx.html