データサイエンス研修 生命情報学コースというページで、バイオインフォマティクスに関連したデータ処理(主にテキストの処理)の問題を出し合ってみんなで解いてみようというようなことをしています。
解答はブログとか公開wikiなどに書くことがルールになっているので、自分はここにつらつらと書いていこうと思います。解答途中でもとりあえずup!の方針なので、ひらめき次第追記していきます。
問題
では最初の問題
データサイエンス研修 生命情報学コース 練習問題 fq00003
問題の引用をする場合は上記コース名と問題番号を記載してください
標準入力、標準出力、標準エラー出力を理解した上で、入出力のプログラミングを行います。
DNA塩基配列と空白類文字のみから成る文字列またはテキストファイルを標準入力から読み込み、
1文字ずつ確認して処理を行うプログラムを書いてください。
T、C、A、Gそれぞれが何塩基含まれているか、
M、R、W、S、Y、K、V、H、D、B、Nの場合は全てまとめてその他として数え、標準出力に出力してください。
塩基は大文字であっても小文字であっても数えます。空白、タブ、改行、復帰文字は無視します。
それ以外の文字が現れた場合は、何文字目に現れたかを添えて標準エラー出力にメッセージを表示し、
実行を途中で止めてください。
(データサイエンス研修 生命情報学コース 練習問題 fq00003)
解答
プログラミング言語はなんでもOKなので、bashのワンライナーで解いてみます。
サンプルの塩基配列は猫のミトコンドリアの塩基配列をダウンロードして利用しました。
more NC_001700_cat_mtDNA.fasta|grep -v ">"|grep -o .|grep -wEo "(A|T|G|C)"|sort|uniq -c
5543 A
4454 C
2406 G
4606 T
「T、C、A、Gそれぞれが何塩基含まれているか」のところだけ。あとの部分は追記。(2022-01-12)
「M、R、W、S、Y、K、V、H、D、B、Nの場合は全てまとめてその他として数える」
「塩基は大文字であっても小文字であっても数える」
「空白、タブ、改行、復帰文字は無視」
ここまではできたかな...
テストはヒトのCYP1A1というタンパク質の配列をダウンロードしてきて使いました。
% more CYP1A1_Hsa.fasta|grep -v ">"|\
grep -o .|\
sed -e 's/[MRWSYKVHDBN]/@/g'|\
grep -wEo "([ATGC@])"|\
sort|\
uniq -c|\
sed -e 's/@/その他/g'
229 その他
23 A
9 C
31 G
長くなってきたので改行いれました。
先ほど使った猫ミトコンドリアの塩基配列だとMとかRとかの文字は入っていないはずなので。
% more NC_001700_cat_mtDNA.fasta|grep -v ">"|grep -o .|sed -e 's/[MRWSYKVHDBN]/@/g'|grep -wEo "([ATGC@])"|sort|uniq -c|sed -e 's/@/その他/g'
5543 A
4454 C
2406 G
4606 T
後の部分(エラーの処理)は追記。(2022-01-14)
注釈
- テストのためにアミノ酸配列のfastaを使ったのですが、「M、R、W、S、Y、K、V、H、D、B、Nの場合は全てまとめてその他として数える」には本来意味があり、混合塩基を表示するときに使う記号を示しています。
記号 | R | M | W | S | Y | K | H | B | D | V | N |
---|---|---|---|---|---|---|---|---|---|---|---|
塩基の種類 | A,G | A,C | A,T | C,G | C,T | G,T | A,T,C | G,T,C | G,A,T | A,C,G | A,C,G,T |