練習問題①
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