perl腳本練習(xí):fasta格式與tab格式序列之間相互轉(zhuǎn)換(2)(適用范圍更廣)

前言

我的認(rèn)知里,fasta格式中“>”只會位于行首。但是我寫腳本用的示例數(shù)據(jù)里出兩行特殊id。這兩個(gè)id中除了行首的“>”,中間還有“>”,造成原腳本不能適用。所以在腳本里加了個(gè)檢查,檢查是否出了行首還有其它位置有“>”。檢查是檢查了,但是還沒有解決問題。于是沒有修改設(shè)定分隔符“$/”的值,而是改成對讀入的每行進(jìn)行檢查了。

今天把改后的適用性更廣的代碼發(fā)出來!腳本有點(diǎ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)

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

代碼

#!/usr/bin/env perl

use strict;

my $usage = "Usage:\nperl $0 -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";
    my $tmp = "tmp"."$ARGV[2]";
    open TMP,'>',$tmp || die "\nERROR: Couldn't open $tmp !\n";
    while (<FA>){
        if(/\A>/){  #按行首>讀入;
            chomp;
            $_ =~ s/^>//;
           print TMP "\n$_\t";#第一行會多一個(gè)空行,所以先建了個(gè)臨時(shí)文件;
        }else{
            chomp;
            print TMP "$_";#此處不添加分隔符,而在id序列行前加換行符;
        }
    }
    close FA;
    close TMP;
    open TMP,$tmp|| die "\nERROR: Couldn't create $tmp !\n";#開始解決空行問題
    open TSV,'>',"$ARGV[2]" || die "\nERROR: Couldn't create $ARGV[2] !\n";
    while(<TMP>){
        next if /^\s+$/;
        print TSV $_;
    }
    print TSV "\n";#R語言read_delim()讀入數(shù)據(jù)框時(shí)提示“Files must end with a newline”,所以在文件最后放入一個(gè)空行。
    close TMP;
    close TSV;
    unlink $tmp; #刪除臨時(shí)文件;
}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";
    my ($id, $seq);
    while(<TSV>){
        next unless (my ($id,$seq) = /(.*?)\t(.*)/s);
        chomp $seq; #對于這么短的模塊,這么寫有點(diǎn)多余了;
        print FA ">$id\n$seq\n"; #printf 取格式化輸出控制每行序列數(shù),有興趣的自己改下。
    } #應(yīng)該不用寫else了,前面已經(jīng)限定了只有這兩種情況才可執(zhí)行;
    close FA;
    close TSV;
}

總結(jié)

  1. 新手寫腳本就是在寫bug
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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