アプリ版:「スタンプのみでお礼する」機能のリリースについて

条件に一致した塩基配列を含むデータの抽出方法を教えて下さい。(perl)

下記のように、塩基配列(ACTTC…)と、その上に配列名(>id_000)が
数百万配列ならんだデータがあります。

(fasta形式)

>id_001
CGCTGCCGGGGAACGGTCTGGTCAGGGATCTATCATGAGG
CGTGGGAATTTCGCCCCGGACAGTGAGGATTTGGGTGCTT
CCTTTGCTGTGATTTTAAGTTACCTCACCAAA
>id_002
GCAGTCCTTCGCCTGAAGTGCAGGACGGGTAGTAACGTAG
AGAGATCTTGCTTAGTTACTACTGC
>id_003
 ・
 ・

この中から、指定した塩基配列(例:TGAAGTGCA)を含むデータを、
下記のように別名のファイルに、配列名と塩基配列を一緒に出力したいのですが、
どのようにすればよいかが、分からず困っています。

>id_002
GCAGTCCTTCGCCTGAAGTGCAGGACGGGTAGTAACGTAG
AGAGATCTTGCTTAGTTACTACTGC
>id_015
ATGTGAAGTGCAGTGTGTTAGT
 ・
 ・

「BioPerl」のSeqIOオブジェクト?を使用することで、
何とか同じ結果を出せるようにはなったのですが、
実際に、どのような処理がされているのかは、理解できていません。

今後、色々なパターンに活用できるよう、perlだけの記述では
どのような記述をすればよいのか、理解したいのです。
perl初心者なので、より基本的な記述だと助かります。
よろしくお願い致します。

A 回答 (3件)

少々泥臭いですすみません



#!/usr/bin/perl
# 使い方の例
# perl このスクリプト.pl TGAAGTGCA

# TODO 要件に合わせて改造
$pattern = (@ARGV == 1)? $ARGV[0]: 'TGAAGTGCA';
open(F, 'foo.fasta') || die "no file error";

$cache = '';
$match = 0;
foreach (<F>) {
# シーケンスデータの始まり
if (/^>/) {
$match = 0;
$cache = $_;
next;
}
# シーケンス文字列に該当パターンが含まれるか検証
if (!$match && /$pattern/) {
$match = 1;
print $cache; # ここまでのシーケンスデータを出力
}
# 入力行を出力またはキャッシュ
if ($match) { print $_; } else { $cache .= $_; }
}
close(F);
    • good
    • 0
この回答へのお礼

ありがとうございます!
しっかり理解して、今後に役立てていこうと思います。

お礼日時:2014/08/29 14:38

探している塩基配列が複数行にまたがる可能性があるので, それぞれの塩基配列ごとに「1つの文字列にしてから」調べる必要がありますね>

#2.
    • good
    • 0

「配列名」がユニークならハッシュを使う.

    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2014/08/29 14:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!