生信必備技能 -- 不可描述

在做 Small RNA 分析的過程中時(shí)遇到了一個(gè)有意思的事情,前期比對(duì)到不同的數(shù)據(jù)庫后需要將不同的短 tags 注釋到不同的類別上锹安,這個(gè)地方有點(diǎn)意思的事情是同一條 tags 可能被注釋到不同的類別上煮嫌,這里就需要對(duì)不同的類別進(jìn)行優(yōu)先級(jí)排序了器净。
一般按照慣例我們會(huì)根據(jù) 已知 miRNA -> rRNA -> tRNA -> ncRNA (snRNA, snoRNA) 的順序進(jìn)行優(yōu)先級(jí)注釋尖淘。

在寫程序的時(shí)候基本上有以下的思路:
首先我獲得了每個(gè)數(shù)據(jù)庫的比對(duì)結(jié)果,知道了哪些 tags 比對(duì)到了相應(yīng)的數(shù)據(jù)庫中倡勇,使用最基本的思路是從 總的 tags 中先剔除比對(duì)到相應(yīng)物種的成熟 miRNA逞刷,然后剔除比對(duì)到物種相應(yīng)的總的 hairpin ( miRNA 前體數(shù)據(jù)庫),然后剔除比對(duì)到 GeneBank 數(shù)據(jù)庫中的 rRNA 以及 tRNA 妻熊, 如果有 snRNA 或者 snoRNA 等 tags 的話依次提取出來夸浅。

思路很簡(jiǎn)單,但是真正動(dòng)手寫腳本的時(shí)候才發(fā)現(xiàn)扔役,這個(gè)過程蘇是多么的冗余帆喇。因?yàn)椋@樣思路下我們?nèi)绻葘?duì)7個(gè)數(shù)據(jù)庫的話亿胸,最少就應(yīng)該用同樣的腳本過濾六次坯钦。好麻煩预皇,還好我比較喜歡偷懶,寫腳本的時(shí)候應(yīng)用了另一種思路:
直接處理所有的 tags 然后對(duì)不同的數(shù)據(jù)庫比對(duì)結(jié)果信息分別建立一個(gè)文件婉刀,通過不同的文件標(biāo)簽進(jìn)行 tags 分類標(biāo)記吟温,這樣就省事多了:
附上源代碼:( 遵循 GLP v3 開源協(xié)議 )

#!/usr/bin/perl -w
use strict;

die "Usage: perl $0 <list> <prefix> <indir> \n" if @ARGV < 3;

my $info_dir = $ARGV[2];
my $sample = $ARGV[1];

my ( %list, %out );

# deal with all tags
open IN,$ARGV[0] or die $!;
while (<IN>){
    chomp;
    next if /^#/;
    my ($id, $cnt) = split /\t/,$_;
    $list{$id}{"count"} = $cnt;
}
close IN;

# indir must contain files like: $sample.m2mature.info 
# t0023555        xxx_tRNA_AM087200_6:80:-        1       20      +
# t0031916        xxx_tRNA_AM087200_6:80:-        1       21      +

opendir DIR, $info_dir or die $!;
foreach my $file (sort grep(/$sample\.\S+\.info$/,readdir(DIR))){
    (my $type) = $file =~ /$sample\.(\S+)\.info/;
    if ($type eq "m2ncgb"){
        open IN,$file or die $!;
        while (<IN>)  {
            chomp;
            next if /^#/;
            next if /^$/;
            my @b = split /\t/,$_;
            my @c = split /_/,$b[1];
            push @{$out{$b[0]}},$c[1];
        }
        close IN;
    } else {
        open IN,$file or die $!;
        while (<IN>)  {
            chomp;
            next if /^#/;
            next if /^$/;
            my @b = split /\t/,$_;
            push @{$out{$b[0]}},$type;
        }
        close IN;
    }
}
close DIR;

foreach my $k (sort keys %list){
    if (exists $out{$k}){
        my $t = @{$out{$k}}==1 ? $out{$k}->[0] :join ",",@{$out{$k}};
        print "$k\t$t\n";
    }else {
        print "$k\t-\n";
    }
}

附上大牛的代碼:行使同樣的功能,代碼量只有我的一半突颊!

#! /usr/bin/perl -w
use strict;
die "perl $0  input.txt prefix  dir\n"  unless @ARGV == 3;

chomp(my @file = glob "$ARGV[2]/$ARGV[1].*info");
my %ha;
foreach(@file){
   my $flag = (split/\./,$_)[-2];
   ding($_,\%ha,$flag);
}
open IN,$ARGV[0]||die;
while(<IN>){
    chomp;
    my $id = (split/\t/,$_)[0];
    $ha{$id} ||= "NA,";
    chop $ha{$id};
    print "$id\t$ha{$id}\n";
}
close IN;

############################################
sub ding{
    my ($p,$q,$f) = @_;
    open IN,$p||die;
    while(<IN>){
        chomp;
        next if /^#|^$/;
        my $a = (split/\t/,$_)[0];
        $q->{$a} .="$f,";
    }
}

perl 真是一門強(qiáng)大的腳本們語言鲁豪。同樣的功能有多種多樣的方法可以將它演繹出來!

** 這里值得重點(diǎn)劃線的地方是 這一句代碼:**

my $t = @{$out{$k}}==1 ? $out{$k}->[0] :join ",",@{$out{$k}};

這里使用了 律秃?:的判斷方式爬橡,問號(hào)前面代表判斷的條件,問號(hào)后面冒號(hào)前面代表?xiàng)l件判斷如果為真則執(zhí)行棒动,否則就執(zhí)行冒號(hào)后面的語句糙申。

歡迎大家留言討論!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末船惨,一起剝皮案震驚了整個(gè)濱河市郭宝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掷漱,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榄檬,死亡現(xiàn)場(chǎng)離奇詭異卜范,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鹿榜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門海雪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人舱殿,你說我怎么就攤上這事奥裸。” “怎么了沪袭?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵湾宙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我冈绊,道長(zhǎng)侠鳄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任死宣,我火速辦了婚禮伟恶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘毅该。我一直安慰自己博秫,他們只是感情好潦牛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著挡育,像睡著了一般巴碗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上静盅,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天良价,我揣著相機(jī)與錄音,去河邊找鬼蒿叠。 笑死明垢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的市咽。 我是一名探鬼主播痊银,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼施绎!你這毒婦竟也來了溯革?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤谷醉,失蹤者是張志新(化名)和其女友劉穎致稀,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俱尼,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抖单,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了遇八。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矛绘。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖刃永,靈堂內(nèi)的尸體忽然破棺而出货矮,到底是詐尸還是另有隱情,我是刑警寧澤斯够,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布囚玫,位于F島的核電站,受9級(jí)特大地震影響雳刺,放射性物質(zhì)發(fā)生泄漏劫灶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一掖桦、第九天 我趴在偏房一處隱蔽的房頂上張望本昏。 院中可真熱鬧,春花似錦枪汪、人聲如沸涌穆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春许赃,著一層夾襖步出監(jiān)牢的瞬間概耻,已是汗流浹背猫缭。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國打工麻养, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人罩锐。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓奉狈,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親涩惑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子仁期,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,185評(píng)論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)竭恬,斷路器跛蛋,智...
    卡卡羅2017閱讀 134,672評(píng)論 18 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件痊硕、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,107評(píng)論 4 62
  • 大哥知道我在那里 一棵榕樹在風(fēng)里 溪流顯小 屋舍顯闊 夜?jié)u漸靜落 我依然有一片天堂放置 一顆熱愛沉睡的心臟 窗外漂...
    泛指燁閱讀 259評(píng)論 1 2
  • 我原本的心 在來時(shí)赊级,我整了整衣襟 如果我從此步入世間 是不是我再也沒有初始的素潔 風(fēng)答我,一切都...
    陳汐年閱讀 2,728評(píng)論 11 21