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

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

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

思路很簡(jiǎn)單,但是真正動(dòng)手寫(xiě)腳本的時(shí)候才發(fā)現(xiàn),這個(gè)過(guò)程蘇是多么的冗余。因?yàn)?,這樣思路下我們?nèi)绻葘?duì)7個(gè)數(shù)據(jù)庫(kù)的話,最少就應(yīng)該用同樣的腳本過(guò)濾六次。好麻煩,還好我比較喜歡偷懶,寫(xiě)腳本的時(shí)候應(yīng)用了另一種思路:
直接處理所有的 tags 然后對(duì)不同的數(shù)據(jù)庫(kù)比對(duì)結(jié)果信息分別建立一個(gè)文件,通過(guò)不同的文件標(biāo)簽進(jìn)行 tags 分類(lèi)標(biāo)記,這樣就省事多了:
附上源代碼:( 遵循 GLP v3 開(kāi)源協(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 真是一門(mén)強(qiáng)大的腳本們語(yǔ)言。同樣的功能有多種多樣的方法可以將它演繹出來(lái)!

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

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

這里使用了 ?:的判斷方式,問(wèn)號(hào)前面代表判斷的條件,問(wèn)號(hào)后面冒號(hào)前面代表?xiàng)l件判斷如果為真則執(zhí)行,否則就執(zhí)行冒號(hào)后面的語(yǔ)句。

歡迎大家留言討論!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容