求關(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é)
- tab分割轉(zhuǎn)換為fasta格式時暫時只能轉(zhuǎn)換為單行序列模式;
- misa的p3_in.pl腳本沒白看。