web-dev-qa-db-ja.com

awkを使用してファイル内のIDでmultifastaファイルからシーケンスを抽出します

別のIDリストで指定されたIDに一致するシーケンスをmultifastaファイルから抽出したいと思います。

FASTAファイルseq.fasta:

>7P58X:01332:11636
TTCAGCAAGCCGAGTCCTGCGTCGTTACTTCGCTT
CAAGTCCCTGTTCGGGCGCC
>7P58X:01334:11605
TTCAGCAAGCCGAGTCCTGCGTCGAGAGTTCAAGTC
CCTGTTCGGGCGCCACTGCTAG
>7P58X:01334:11613
ACGAGTGCGTCAGACCCTTTTAGTCAGTGTGGAAAC
>7P58X:01334:11635
TTCAGCAAGCCGAGTCCTGCGTCGAGAGATCGCTTT
CAAGTCCCTGTTCGGGCGCCACTGCGGGTCTGTGTC
GAGCG
>7P58X:01336:11621
ACGCTCGACACAGACCTTTAGTCAGTGTGGAAATCT
CTAGCAGTAGAGGAGATCTCCTCGACGCAGGACT

IDファイルid.txt:

7P58X:01332:11636
7P58X:01334:11613

Id.txtファイルのIDに一致するシーケンスのみを含むfastaファイルを取得したい:

>7P58X:01332:11636
TTCAGCAAGCCGAGTCCTGCGTCGTTACTTCGCTTT
CAAGTCCCTGTTCGGGCGCC
>7P58X:01334:11613
ACGAGTGCGTCAGACCCTTTTAGTCAGTGTGGAAAC

私は答えで見つけたawkアプローチが本当に好きです ここここ 、しかしそこに与えられたコードは私が与えた例ではまだ完全には機能していません。理由は次のとおりです。

(1)

awk -v seq="7P58X:01332:11636" -v RS='>' '$1 == seq {print RS $0}' seq.fasta

このコードは複数行のシーケンスでうまく機能しますが、IDはコードとは別に挿入する必要があります。

(2)

awk 'NR==FNR{n[">"$0];next} f{print f ORS $0;f=""} $0 in n{f=$0}' id.txt seq.fasta

このコードはid.txtファイルからIDを取得できますが、複数行シーケンスの最初の行のみを返します。

コード(2)のRS変数を変更するのは良いことだと思いますが、これまでのところすべての試みは失敗しました。誰か助けてくれませんか?

7
Dalibor Miklík
$ awk -F'>' 'NR==FNR{ids[$0]; next} NF>1{f=($2 in ids)} f' id.txt seq.fasta
>7P58X:01332:11636
TTCAGCAAGCCGAGTCCTGCGTCGTTACTTCGCTT
CAAGTCCCTGTTCGGGCGCC
>7P58X:01334:11613
ACGAGTGCGTCAGACCCTTTTAGTCAGTGTGGAAAC
3
Ed Morton

awkをフォローすると、同じように役立つ場合があります。

awk 'FNR==NR{a[$0];next} /^>/{val=$0;sub(/^>/,"",val);flag=val in a?1:0} flag' ids.txt  fasta_file
2
RavinderSingh13