計算FASTA文件中每條序列的長度
輸入文件fasta.txt
>con1
GTTCATAACTTACCATTGACTGTTCATGATTTAAACTGTGTCTTCCTGTTCTTTTAGTTGCTTTGGATACTATAAGGTCAGAACTAGAA
>con2
GGGACCAGGTGGGAAGCTGCTGCTTTCTTTTCCCTTTTGGTCTTCTTGGGCCCACCCTTCAGCTTCTGCTTTTCTTCATCTTCTCGGTTTTGAGGCCAGGAGGCAGCCAGTATCCTGGCCGCTTCTGCTTGAGAGCTGGTCCCCTCCTCT
>con3
TCCAGAGCCAGTTCCCTGACGATGCCGAGGTTTACCGGCTCATCGAGGTGACTGGCCTTGCCAGGAGCGAGATCAAGAAGTGGTTCAGTGACCACCGATATCGGTGTCAAAGGGGCATCGTCCACATCACCAG
>con4
TTTTCCTCCAAGTGTACAAGACTGATCTGGAGAAGGACATTATTTCGGACACATCTGGTGACTTCCGCA
>con5
GTTTGCATCGTCATCCAATTTTTTTTCATATGCCCCAAACCCATTCAATTTCTGATTGTGTTGTGTTCCCTGGTGTAAGATATCTCCCAGGAGAGGGCCACACATTCCCCAGAGGTGGACCTTCTTGGTACATACACC
?
?
?
?
?
?
?
?
?
?
?
?
自己寫腳本
#!/usr/bin/perl
my ($f,$out)=@ARGV;
open(DATA,$f) or die "infile 文件無法打開,$f";
open(OUT,">$out")||die $!;
$/=">";<DATA>; #設(shè)置輸入記錄分隔符為">",并去除第一個">"
while(<DATA>){
$line=$_;
my $id=$1 if($line=~/^(\S+)/); #獲取序列ID
chomp $line; #去掉末尾的換行
$line=~s/^.+?\n//; #刪除第一行
$line=~s/\s//g; #刪除序列中的空白字符
my $gc = () = /G/g;
my $cc = () = /C/g;
my $len=length($line); #計算序列長度
my $gcc=($gc+$cc)/$len;
print OUT "$id\t$gcc\n"; #輸出結(jié)果到輸出文件中
}
close IN;
close OUT;
網(wǎng)上其他答案
#!/usr/bin/perl -w
use strict;
unless (@ARGV==2){ #@ARGV 傳給腳本的命令行參數(shù)列表
die"Usage: perl $0 <input.fa><out.gc>\n"; #當命令行參數(shù)不是2的時候輸出使用說明
}
my ($infile,$outfile)=@ARGV; #把命名行參數(shù)賦值給輸入、輸出文件
open IN,$infile||die"error:can't open infile:$infile"; #打開輸入文件句炳IN
open OUT,">$outfile"||die $!; #打開輸出文件句柄OUT
$/=">";<IN>; #設(shè)置輸入記錄分隔符為 ">",并去除第一個”>"
while (<IN>){ #$_=<IN>,把序列ID行和序列賦值給$_,$_=可以省略不寫
my $id=$1 if(^/(\S+)/); #獲取序列ID
chomp; #去掉末尾換行符
s/^.+?\n//; #刪除第一行
s/\s//g; # 刪除序列中的空白字符
my $GC=(tr/GC/GC/);#計算G或C堿基個數(shù)
my $AT=(tr/AT/AT/); #計算A或T堿基個數(shù)
my $len=$GC+$AT; # 計算序列非N長度
my $gc_cont = $len ? $GC/$len :0 ; #計算GC含量,如果長度為0,GC含量為0
print OUT "$id\t$gc_cont\n"; #輸出結(jié)果到輸出文件
}
close IN;
close OUT;
自己寫的還是會有欠缺雏赦,沒有考慮GC為0的情況,還分別計算了G 和C的個數(shù)芙扎,然后相加星岗,完全可以用(tr/GC/GC/)來計算。