練習問題①

1.awkで数字の絶対値を返す関数 absを作ってみる。

awk '
 function abs(x){
  if(x>0){
   return x
  }else{
   return -x
  }
 }
 BEGIN{
  print abs(5);
  print abs(-5);
 }
'

2.四捨五入する関数roundを作ってみる。(int()関数で切り捨ては出来る)

awk '
 function round(x){
  if(x>0){
   return int(x+0.5)
  }else{
   return int(x-0.5)
  }
 }
 BEGIN{
  print round(5.6);
  print round(-5.6);
 }
'

練習問題② GOアノテーション情報の整理

go.oboファイルをGene Ontology Consortiumのページからダウンロードする http://geneontology.org/page/download-ontology

wget http://purl.obolibrary.org/obo/go.obo

このファイルは、[Term]という行の直後に、GOのIDが記述され、その次の行に名前が記述されている。 さらに数行後に、isa: から始まる行がある(ないこともある)。 このisaの行は、GOのより大きな階層の情報(親のGOとでも呼んでおく)を示している。 例: GO:0000001 mitochondrion inheritance の場合、

is_a: GO:0048308 ! organelle inheritance
is_a: GO:0048311 ! mitochondrion distribution

とより広義な意味を持つGOにリンクされている。

1.該当レコードのGO IDを1次元目、親のGO IDを2次元目に格納せよ。

2.逆に、親のGO IDを1次元目、該当レコードのGO IDを2次元目に格納せよ。

3.

GO:0008150 (biological_process)
GO:0005575   (cellular_component)
GO:0003674   (molecular_function)

を直接の親とするGO:IDをそれぞれすべて表示せよ。

#まず"[Typedef]"以降を削除したファイルを作っておく
awk '{if($1=="[Typedef]"){exit}; print $0}' go.obo > go.obo.notypedef

#biological_processを表示させる場合
awk '
{
 if($1=="id:"){
  goid=$2
 }
 if($1=="name:"){
  name[goid]=$0
 }
 if($1=="is_a:"){
  child2parent[goid][$2]=1;
  parent2child[$2][goid]=1;
 }
}
END{
 for(i in parent2child["GO:0008150"]){
  print i,name[i];
 }
}
' go.obo.notypedef

4. 任意のGO:IDが与えられたら、その親、親の親、・・・とすべて表示せよ。親は1つだけとは限らない(1対1対応ではない)ことに注意。

awk '
function search_parent(x, space,  i){
 print space, x, name[x];
 if(length(child2parent[x])>0){
  for(i in child2parent[x]){
   search_parent(i, " "space)
  }
 }
}
{
 if($1=="id:"){
  goid=$2
 }
 if($1=="name:"){
  name[goid]=$0
 }
 if($1=="is_a:"){
  child2parent[goid][$2]=1;
  parent2child[$2][goid]=1;
 }
}
END{
 search_parent("GO:0000001");
}
' go.obo.notypedef

##出力結果:
 GO:0000001 name: mitochondrion inheritance
  GO:0048308 name: organelle inheritance
   GO:0006996 name: organelle organization
    GO:0016043 name: cellular component organization
     GO:0009987 name: cellular process
      GO:0008150 name: biological_process
     GO:0071840 name: cellular component organization or biogenesis
      GO:0008150 name: biological_process
  GO:0048311 name: mitochondrion distribution
   GO:0007005 name: mitochondrion organization
    GO:0006996 name: organelle organization
     GO:0016043 name: cellular component organization
      GO:0009987 name: cellular process
       GO:0008150 name: biological_process
      GO:0071840 name: cellular component organization or biogenesis
       GO:0008150 name: biological_process
   GO:0051646 name: mitochondrion localization
    GO:0051640 name: organelle localization
     GO:0051641 name: cellular localization
      GO:0051179 name: localization
       GO:0008150 name: biological_process