求关注
如果觉得推文有用的话一定记得看下我的个人简介,关注下呀~
前言
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;
总结
- tab分割转换为fasta格式时暂时只能转换为单行序列模式;
- misa的p3_in.pl脚本没白看。
网友评论