条件に一致した塩基配列のデータ抽出方法

このQ&Aのポイント
  • 条件に一致した塩基配列を含むデータを抽出する方法を教えてください。(perl)
  • CGCTGCCGGGGAACGGTCTGGTCAGGGATCTATCATGAGGという塩基配列を含むデータを、fasta形式のファイルから抽出するには、BioPerlのSeqIOオブジェクトを使用すると便利です。
  • Perlでデータの処理を行う際には、条件に合致する塩基配列を正規表現を使って検索し、そのデータを別のファイルに出力するような処理を行います。具体的な方法は、コードを見る必要がありますが、基本的な記述としては、ファイルを読み込んでデータを処理し、条件に一致したデータを別のファイルに出力する手順を追っていくことになります。
回答を見る
  • ベストアンサー

条件に一致した塩基配列を含むデータを抽出するには?

条件に一致した塩基配列を含むデータの抽出方法を教えて下さい。(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初心者なので、より基本的な記述だと助かります。 よろしくお願い致します。

  • go-ne
  • お礼率77% (71/92)
  • Perl
  • 回答数3
  • ありがとう数12

質問者が選んだベストアンサー

  • ベストアンサー
  • Ogre7077
  • ベストアンサー率65% (170/258)
回答No.2

少々泥臭いですすみません #!/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);

go-ne
質問者

お礼

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

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

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

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

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

go-ne
質問者

お礼

ありがとうございます。

関連するQ&A

  • ACCESS抽出条件でデータ型が一致しません

    ACCESSのクエリで抽出条件に"20140106"と入力しますと下記のエラーメッセージが出てきます。 教えて頂けないでしょうか? 抽出条件でデータ型が一致しません。(Error 3464) Find 系メソッドの抽出条件式で、比較する値のデータ型がフィールドのデータ型と一致していません。

  • 条件に一致したデータの検索・抽出について

    エクセルで2つのデータから条件に一致したデータを検索・抽出がしたいのですが、うまく抽出することができないため、質問させていただきます データA |入荷日|商品番号|商品名|数量|金額| |1.1|1111|〇〇〇|10|10| |1.2|2222|◎◎◎|15|15| |1.3|3333|△△△|20|20| |1.4|4444|◆◆◆|10|10| データB |販売日|商品番号|商品名|販売数| |3.1|1111|〇〇〇|   | |3.2|    |AAA|100| |3.3|    |BBB|120| |3.1|2222|◎◎◎|   | |3.3|    |CCC|100| |3.1|3333|△△△|   | |3.1|4444|◆◆◆|   | データBから商品番号の一致したデータの一部を抽出してデータAに追加したいです (一部が難しいようなら1行そのまま抽出でも大丈夫です) 理想は |入荷日|商品番号|商品名|数量|金額|販売数| |1.1|1111|〇〇〇|10|10|   | |   |    |AAA|  |  |100| |   |    |BBB|  |  |120| |1.2|2222|◎◎◎|15|15|   | |   |    |CCC|  |  |100| |1.3|3333|△△△|20|20|   | |1.4|4444|◆◆◆|10|10|   | もしくは、関数を利用して以下の形にできれば、と思います |入荷日|商品番号|商品名|数量|金額|商品名|販売数|商品名|販売数| |1.1|1111|〇〇〇|10|10|AAA|100|BBB|120| |1.2|2222|◎◎◎|15|15|CCC|100|   |   | |1.3|3333|△△△|20|20|   |   |   |   | |1.4|4444|◆◆◆|10|10|   |   |   |   | データAをベースに、データBから重複データのうちすでにデータAにあるものを省き(1件目は重複データなので2件目以降)抽出する 1.データB商品番号重複しています。重複データの1件目はデータAと共通で、2件目以降を抽出したいです 2.データB商品番号の重複はそれぞれ違うため、1件も重複してないものもあれば3件ほど重複しているものもあります 3.データAは入荷日の範囲を指定したデータですが、データBは入荷日項目がないため抽出する必要のない内容・件数のデータもはいっています。その為、データAから抽出するのではなく、データAをベースにデータBから抽出がしたいです。 よろしくお願いします。

  • ACCES「抽出条件でデータ型が一致しません」

    環境 WindowsXP Access2003 SELECT A.ID, A.NAME, A.DATE FROM ( (SELECT ID, NAME, DATE FROM ・・・) A LEFT JOIN (SELECT ID, NAME, DATE FROM ・・・) B ON A.ID = B.ID ) ORDER BY A.ID こんな感じのSQLを実行すると、 「抽出条件でデータ型が一致しません」 というエラーとなります。 SQL文を以下の様に変更すると、エラーにはなりません。 1.「ORDER BY A.ID」排除 2.ORDER句を「A.ID」以外の「A.NAME」「A.DATE」「B.ID」「B.NAME」「B.DATE」に変更 3.ON句の順番を「ON B.ID = A.ID」に入れ替え(ORDER句は、「A.ID」のまま) なぜ、このようなエラーになるのでしょうか? 特に3が理解不能なのですが、 ON句の順番がORDER句に影響を及ぼすことがあるのでしょうか? 以上、よろしくお願いします。

  • ユーザー認証でSQLのデータと一致するものだけをログインできるようにするには

    PHP初心者です。 タイトルが長くなり、申し訳ありません。 ユーザーのBASIC認証ダイアログを表示させ、データベースのテーブルに書かれたデータと一致するものだけをログインできるようにするにはどうしたら良いでしょうか。 まずデータベースにあるテーブルからIDとパスワードを抽出します。 でも、この場合変数は配列になりますよね。 その配列の変数の宣言の書き方とデータ照合を一致させる方法を知りたくて質問しました。 どうぞ宜しくお願い致します。

    • 締切済み
    • PHP
  • 不一致クエリで異なるデータ抽出

    アクセスのテーブル「T_契約今月」とテーブル「T_契約先月」を 比べて、価格の違うものを抽出しようと思っています。 不一致クエリで「先月は契約があって今月は無いもの」と 「今月は契約があって先月は無いもの」は抽出する事が出来ました。 (NULLで設定) しかし、どちらにもデータがあって価格だけが違うものを抽出 出来るようにしたいのですが、不一致クエリの設定の仕方が 分かりませんでした。 どのように設定すればいいか教えて頂けないでしょうか? ちなみにテーブルの構成は、以下のフィールドで構成されて います。 「顧客ID」 「契約商品」 「価格」 「契約開始」 「契約終了」 テーブル「T_契約先月」は先月分の確定分の契約データが 入っています。 テーブル「T_契約今月」には、管理中の今月のデータが入って います。 どうかご教授願います。

  • MSアクセス 条件に合うデータのみを抽出してフォームを開けたい

    アクセスの初心者です。ご指導よろしくお願いします。 フォームで条件に合うデータのみを抽出してフォームを開けたいと四苦八苦しています。 現在は汎用フォームを使い、パスIDとパスワードを入れて照合するとDoCmd.OpenForm "フォーム名", , , " [社員No] = 1" で[社員No]「1」のデータのみ抽出した別フォームが開くようになっています。 希望としては、照合した人が照合した人が持つ[社員No]のデータのみが開くようにしたいと考えています。 パス管理のテーブルは ID、 社員No、社員名、パスID、パスワードになっています。   DoCmd.OpenForm "フォーム名", , , " [社員ID] = 1" の「=1」のところが[パスID][パスワード]と一致する社員Noに置き換える方法を教えてください。 わかりにくい質問で申し訳ないですが、よろしくお願いします。

  • Accessクエリの抽出条件にフォームから挿入する方法

    Accessフォームのテキストボックスに入力されたデータを、クエリの抽出条件に挿入したいのですが、その際部分一致で検索したいため、抽出条件にLike "*[Forms]![フォーム名]![テキストボックス名]*"と記述したのですがうまく行きません。 どのように記述すれば部分一致で検索できるのかお教えください。

  • 配列データを置き換える

    こんにちは。お世話になっております。 タイトルにあるように、配列のことでお伺いしたいのですが、 既に存在する配列($array1)と、ポストされた配列($array2)があるとします。 $array1=array("佐藤","田中","鈴木","吉田","加藤","岡田"); $array2=array("佐藤","佐々木","鈴木","吉田","岡田","加藤"); そこで、元の配列をポストされた配列に置き換えるようなものを作りたいのですが(実際は置き換えるというより、配列内を修正という感覚で行っています)、for文を用い配列内のデータ数を繰り返し処理を行いながら、array_splice()などを使いながら、ポストされたデータから元の配列と一致していれば、そのまま新規配列にセット。一致しなければ、ポストされたデータをセット。という具合に行うべきか?と、ソースを記述している段階なのですが、もっと効率のよい方法はないものか?と思い、皆さまにアドバイスいただきたく投函させて頂きました。 上手く説明できずに申し訳ありませんが、ご指導頂戴出来れば幸いです。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • ある条件に一致するシートの検索と抽出

    初めて質問します。 あるアンケートを実施し、1人1つのシートを複数枚、一つのブックに まとめたとします。 「シート1」   A   B    C   D・・・ 1 ID   氏名 2 003 Cさん 3 Q1  (1) 4 Q2  (2) 「シート2」   A   B    C   D・・・ 1 ID   氏名 2 001 Aさん 3 Q1  (2) 4 Q2  (3) この時、シートの並びはIDや名前の順にはなっておらず、順不同です。 ですので、どのシートが誰なのかがシート名ではわからない状態です。 このような状態で、例えば 下記「集計シート」のA2と一致するIDがあるシートから上記B3の結果を抽出し、 下記C2に返す、というのを関数でつくることはできるでしょうか。   A   B    C   D・・・ 1 ID   氏名  Q1  Q2・・・ 2 001 Aさん        ・・・ 3 002 Bさん        ・・・ 誰がどのシートなのかわからないため、IDを頼りに該当者を発見し、その人の 回答を集計シートにまとめる、ということになります。 どなたかご教示いただけますと幸いです。

  • MySQL 複数フィールドで不一致の抽出

    ジャンル  id ジャンル名 日 数 id ----+---------------+--------------+---------+------- 001 ワンピース 20110518 10 a001 001 ワンピース 20110518 6 a002 002 アクセサリー 20110518 5 b002 仮に、このようなデータがあったとします。 数時間後には、↓のように変更がかかって送られてきます。 001 ワンピース 20110519 7 a001 001 ワンピース 20110518 6 a002 002 アクセサリー 20110519 9 b002 データ配布元の問題で、内容が更新された時点で、まだデータが確定していないものは、前日のデータが混ざって送られてきます。 この仕様を改良することは、残念ながら全く不可能です。 しかし、このデータをそのままテーブルに取り込んでしまうと、当然、2行目が重複してテーブルに収まってしまい、その後のデータ抽出に支障がでます。 例の場合でいえば、既に存在している2行目のデータを捨て、1行目と3行目のみを抽出する方法を探しています。 そこで、全部のデータを持つのをテーブル1とし、新しく着いたデータ(0519を含む方)をテーブル2に一時保管て、 SELECT テーブル2.ジャンルid, テーブル2.ジャンル名, テーブル2.日, テーブル2.数, テーブル2.ID FROM テーブル2 LEFT JOIN テーブル1 ON (テーブル2.ID = テーブル1.ID) AND (テーブル2.数 = テーブル1.数) AND (テーブル2.日 = テーブル1.日) AND (テーブル2.ジャンルid = テーブル1.ジャンルid) WHERE (((テーブル1.ジャンルid) Is Null)); と不一致SQLをAccessで行ったところ、1行目と3行目までが抽出できました。 ジャンルid、日、数、id が一致しないものを取りだすという不一致クエリの改造です。 ところが、同じSQLを、本番であるMySQLで行ったところ、データが抽出できす、反応が無くなってしまいます。 サンプルでは件数を絞りましたが、実際には1回分のデータが1万件近くあり、さらにメインテーブルは60万件ほどになるため、量が多すぎるためとも思いますが、4時間経ってもクエリの結果が返って来ないのは、MySQLとなにか合わないのではないかと思います。 MySQLで、上記と同じく、ジャンルid、日、数、id の全てが一致しないデータを抽出する事は可能でしょうか? ちなみに、MySQLテーブルでは、idの前にインクリメントのフィールドを置き、インデックスもインクリメントのフィールドで作成してあります。 よろしくお願いします。