多個fasta文件中去除重復序列

前言

需求:N個fasta文件半开,里面的序列可能有大量的重復隅茎,但是其header并不一定相同裙盾,需要把他們合并并去重朱巨。

方法一

首先用cat命令將他們合并

cat *.fasta > merge.fasta

perl合并

perl rmfastadup.pl merge.fasta nodup.fasta
rmfastadup.pl 代碼如下:

#! /usr/bin/perl

# Downloaded from http://www.bioinformatics-made-simple.com
# 去除fasta文件中重復的序列
# 用法:perl rmfastadup.pl input,fasta output.fasta
use Bio::Perl;
my $infile1 = $ARGV[0];
my %FIRSTSEQ;
my $total = 0;
my $total1=0;
my $dup = 0;

open (OUTIE, ">$ARGV[1]");

$infile1 = Bio::SeqIO -> new('-format'=>'Fasta',-file => $infile1);

#read in all fasta sequences

while ((my $seqobj = $infile1->next_seq()))
{

    $rawid = $seqobj -> display_id;
    $seq = $seqobj -> seq;

    #print "ID is $rawid\n";
    #print "Sequence is $seq\n";

    

    if(defined($FIRSTSEQ{$seq}))
    {
        print "Key match with $FIRSTSEQ{$seq}\n";
    
        $dup++;
    }
    else
    {
        $FIRSTSEQ{$seq} = $rawid;
        $total++;
    }
}

while ( ($key, $value) = each(%FIRSTSEQ) )
{
    print OUTIE ">$value\n";
    print OUTIE "$key\n\n";
    $total1++;
}

print "\n$total unduplicated sequences in the file\n";
print "$dup duplicated sequences in the file\n";
print "$total1 unique sequences printed out.\n";

close(OUTIE);

這個方法在fasta文件數(shù)量少、序列少的情況下比較簡單好用颖医,但是序列數(shù)多了以后就會賊慢位衩,讓人受不了,親測10G的fasta整整跑了四個多小時熔萧,吐血糖驴。

方法二

大量的序列僚祷,必須通過多線程的編程來提高效率,下面提供了一個perl代碼贮缕,是上面的多線程版本久妆。

用法

perl p-rmfastadup.pl file1.fasta file2.fasta <...>
最后會生成nodup.fasta文件。
另外跷睦,核心數(shù)可以自行修改筷弦,具體看代碼中的注釋吧

p-rmfastadup.pl的代碼如下

#! /usr/bin/perl

#同時處理X個fasta文件,最終去除這些fasta文件中序列相同的(header可以不同抑诸,一概被認為是同一序列)序列烂琴,最終輸出無重復的fasta文件:nodup.fasta
#usage: perl p-rmfastadup.pl file1.fasta file2.fasta <...>

use threads;
use threads::shared;
use Bio::Perl;

my %FIRSTSEQ : shared;
my $total : shared;
my $total1 : shared;
my $dup : shared;
my @files : shared;

@files = @ARGV;

# 創(chuàng)建線程,可以自行增減
my $t1 = threads->create(\&checkfasta);
sleep(0.1);
my $t2 = threads->create(\&checkfasta);

my $t3 = threads->create(\&checkfasta);

my $t4 = threads->create(\&checkfasta);

my $t5 = threads->create(\&checkfasta);

my $t6 = threads->create(\&checkfasta);

my $t7 = threads->create(\&checkfasta);

my $t8 = threads->create(\&checkfasta);

my $t9 = threads->create(\&checkfasta);

my $t10 = threads->create(\&checkfasta);


 # 收割線程蜕乡,需要配合上面的線程
$t1->join; 
$t2->join;
$t3->join;
$t4->join;
$t5->join; 
$t6->join;
$t7->join;
$t8->join;
$t9->join; 
$t10->join;

sub checkfasta {
    while (@files) {
        my $infile1  = shift @files;
        print $infile1."\n";
        $infile1 = Bio::SeqIO -> new('-format'=>'Fasta',-file => $infile1);

        #read in all fasta sequences

        while ((my $seqobj = $infile1->next_seq()))
        {

            $rawid = $seqobj -> display_id;
            $seq = $seqobj -> seq;

            #print "ID is $rawid\n";
            #print "Sequence is $seq\n";



            if(defined($FIRSTSEQ{$seq}))
            {
                print "Key match with $FIRSTSEQ{$seq}\n";

                $dup++;
            }
            else
            {
                $FIRSTSEQ{$seq} = $rawid;
                $total++;
            }
        }
    }
}

#checkfasta();

open (OUTIE, ">nodup.fasta");
while ( ($key, $value) = each(%FIRSTSEQ) )
{
    print OUTIE ">$value\n";
    print OUTIE "$key\n\n";
    $total1++;
}


print "$total1 unique sequences printed out.\n";

close(OUTIE);

2020.6.26更新

沒事干造什么輪子奸绷,已經(jīng)有人寫好啦!用seqkit完美解決需求层玲!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末号醉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辛块,更是在濱河造成了極大的恐慌畔派,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件润绵,死亡現(xiàn)場離奇詭異线椰,居然都是意外死亡,警方通過查閱死者的電腦和手機尘盼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門憨愉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卿捎,你說我怎么就攤上這事配紫。” “怎么了午阵?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵躺孝,是天一觀的道長。 經(jīng)常有香客問我趟庄,道長括细,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任戚啥,我火速辦了婚禮,結(jié)果婚禮上锉试,老公的妹妹穿的比我還像新娘猫十。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布拖云。 她就那樣靜靜地躺著贷笛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宙项。 梳的紋絲不亂的頭發(fā)上乏苦,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機與錄音尤筐,去河邊找鬼汇荐。 笑死,一個胖子當著我的面吹牛盆繁,可吹牛的內(nèi)容都是我干的掀淘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼油昂,長吁一口氣:“原來是場噩夢啊……” “哼革娄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起冕碟,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤拦惋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后安寺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體架忌,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年我衬,在試婚紗的時候發(fā)現(xiàn)自己被綠了叹放。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡挠羔,死狀恐怖井仰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情破加,我是刑警寧澤俱恶,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站范舀,受9級特大地震影響合是,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜锭环,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一聪全、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辅辩,春花似錦难礼、人聲如沸娃圆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讼呢。三九已至,卻和暖如春谦炬,著一層夾襖步出監(jiān)牢的瞬間悦屏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工键思, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留础爬,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓稚机,卻偏偏與公主長得像幕帆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子赖条,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容