perl腳本練習(xí):fasta格式與tab格式序列之間相互轉(zhuǎn)換(1)

求關(guān)注

如果覺得推文有用的話一定記得看下我的個人簡介,關(guān)注下呀~

前言

seqkit 是序列處理的明星軟件,里面的fx2tab與tab2fx功能是將fasta或者fastq格式文件與tab分割的格式的序列相互轉(zhuǎn)換,還可以添加一些統(tǒng)計功能。今天用perl腳本實現(xiàn)下fasta格式與tab格式的相互轉(zhuǎn)換功能。

使用

將fasta格式轉(zhuǎn)換為tab分割

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

將tab分割的文件轉(zhuǎn)換為fasta格式

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

注意事項:腳本和輸入文件只能放在當(dāng)前目錄。

代碼

#!/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;#注意優(yōu)先級;新手寫的,是不是很神奇;
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"; #不會整理序列長度,先這么寫吧;
    } #應(yīng)該不用寫else了,前面已經(jīng)限定了只有這兩種情況才可執(zhí)行;
}

close FA;
close TSV;

總結(jié)

  1. tab分割轉(zhuǎn)換為fasta格式時暫時只能轉(zhuǎn)換為單行序列模式;
  2. misa的p3_in.pl腳本沒白看。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容