2016-07-20 4 views
0

私は2つのファイルを持っています。 1つはfastaファイルで、複数のfastaシーケンスが含まれていますが、別のファイルには検索したい候補シーケンスの名前が含まれています(下記のファイルの例)。シーケンス名を含む2番目のファイルを指定して、AWKを使用してfastaファイルを検索します

seq.fasta

>Clone_18 
GTTACGGGGGACACATTTTCCCTTCCAATGCTGCTTTCAGTGATAAATTGAGCATGATGGATGCTGATAATATCATTCCCGTGT 
>Clone_23 
GTTACGGGGGGCCGAAAAACACCCAATCTCTCTCTCGCTGAAACCCTACCTGTAATTTGCCTCCGATAGCCTTCCCCGGTGA 
>Clone_27-1 
GTTACGGGGACCACACCCTCACACATACAAACACAAACACTTCAAGTGACTTAGTGTGTTTCAGCAAAACATGGCTTC 
>Clone_27-2 
GTTACGGGGACCACACCCTCACACATACAAACACAAACACTTCAAGTGACTTAGTGTGTTTCAGCAAAACATGGCTTCGTTTTGTTCTAGATTAACTATCAGTTTGGTTCTGTTTGTCCTCGTACTGGGTTGTGTCAATGCACAACTT 
>Clone_34-1 
GTTACGGGGGAATAACAAAACTCACCAACTAACAACTAACTACTACTTCACTTTTCAACTACTTTACTACAATACTAAGAATGAAAACCATTCTCCTCATTATCTTTGCTCTCGCTCTTTTCACAAGAGCTCAAGTCCCTGGCTACCAAGCCATCG 
>Clone_34-3 
GTTACGGGGGAATAACAAAACTCACCAACTAACAACTAACTACTACTTCACTTTTCAACTACTTTACTACAATACTAAGAATGAAAACCATTCTCCTCATTATCTTTGCTCTCGCTCTTTTCACAAGAGCTCAAGTCCCTGGCTACCAAGCCATCGATATCGCTGAAGCCCAATC 
>Clone_44-1 
GTTACGGGGGAATCCGAATTCACAGATTCAATTACACCCTAAAATCTATCTTCTCTACTTTCCCTCTCTCCATTCTCTCTCACACACTGTCACACACATCC 
>Clone_44-3 
GTTACGGGGGAATCCGAATTCACAGATTCAATTACACCCTAAAATCTATCTTCTCTACTTTCCCTCTCTCCATTCTCTCTCACACACTGTCACACACATCCCGGCAGCGCAGCCGTCGTCTCTACCCTTCACCAGGAATAAGTTTATTTTTCTACTTAC 

name.txt

Clone_23 
Clone_27-1 

私はFASTAファイルを検索し、名前で保存された、指定された候補者のためのすべてのFASTA配列を得るためにAWKを使用したいです別のファイル。

awk 'NR==FNR{a[$1]=$1} BEGIN{RS="\n>"; FS="\n"} NR>FNR {if (match($1,">")) {sub(">","",$1)} for (p in a) {if ($1==p) print ">"$0}}' name.txt seq.fasta 

問題は、私はこれだけ

>Clone_23 
GTTACGGGGGGCCGAAAAACACCCAATCTCTCTCTCGCTGAAACCCTACCTGTAATTTGCCTCCGATAGCCTTCCCCGGTGA 

のように、name.txtで第一候補のシーケンスを抽出することができるということです誰もが上記の1行のawkコマンドを修正するために助けることができますか?

+0

回答が投稿された後、あなたは根本的に質問を変更しました。私はそれを巻き返した。その場合は新しい質問を投稿してください。 (そしてあなたがここで得た答えから適応しようとしたことを示してください) – hek2mgl

+0

90分で1つの質問しか投稿できません。 Answerセッションで新しい例を投稿できますか? – user2993059

+0

さて、実際には、コメントを使用するか、質問を再編集することをお勧めします(例を示すためにフォーマットを使用する必要があるため) – user2993059

答えて

2

それは大丈夫ですかさえも、同様の名前を印刷したい場合、あなたは、単にgrepを使用することができます。リテラル文字列ではなく、通常のようname.txt

  • -F扱い、それらをより

    grep -Ff name.txt -A1 a.fasta 
    
    • -f name.txtピックパターン式
    • A1は、一致する行に次の行を出力します。

    名は出力で望まれていない場合、私は別のgrep単にパイプう:

    above_command | grep -v '>' 
    

    awkソリューションは次のようになります。

    awk 'NR==FNR{n[$0];next} substr($0,2) in n && getline' name.txt a.fasta 
    

    ベター複数行のバージョンで説明:

    # True as long as we are reading the first file, name.txt 
    NR==FNR { 
        # Store the names in the array 'n' 
        n[$0] 
        next 
    } 
    
    # I use substr() to remove the leading `>` and check if the remaining 
    # string which is the name is a key of `n`. getline retrieves the next line 
    # If it succeeds the condition becomes true and awk will print that line 
    substr($0,2) in n && getline 
    
  • +1

    うーん、もしgetlineが失敗した場合にはどうなるのだろうか... ;-)。 getline(ヒント - あなたはここではありません)を使用しなければならない場合、少なくとも 'if((getline line)> 0)print line'を使って自分自身を失敗から守ってください。 http://awk.freeshell.org/AllAboutGetlineを参照してください。 –

    +0

    ねえ。私はそれについて考えていましたが、 'getline'がこの場合失敗すると、fastaフォーマットが壊れてしまい、実際には*シーケンスを含んでいないので、問題ではないと思っていました。ではない? – hek2mgl

    +0

    さて、わかりました。その場合、望ましくない名前が表示されます。fastaファイルが正しいとしましょう! ;) – hek2mgl

    2
    $ awk 'NR==FNR{n[">"$0];next} f{print f ORS $0;f=""} $0 in n{f=$0}' name.txt seq.fasta 
    >Clone_23 
    GTTACGGGGGGCCGAAAAACACCCAATCTCTCTCTCGCTGAAACCCTACCTGTAATTTGCCTCCGATAGCCTTCCCCGGTGA 
    >Clone_27-1 
    GTTACGGGGACCACACCCTCACACATACAAACACAAACACTTCAAGTGACTTAGTGTGTTTCAGCAAAACATGGCTTC 
    
    +0

    1つのシーケンスが複数の行に分割されている場合、上記のコマンドは最初の行のみを読み取ることができます。それが私がデフォルトRSを変更した理由です。上記の変更された例を参照してください – user2993059

    +0

    あなたの例では変更はありません。このソリューションを調整して複数行のレコードを扱うのは簡単ではありませんが、質問にその情報を含めなかった理由を想像できず、最初の例場所は - 私はそれがファイルの内容の形式を知る必要があるファイルを解析することは明らかです願っています!複数の連続した '>'行のように使用するためのその他の驚きがありますか?正確な入出力で新しい質問を投稿すれば、そこから取得します。 –

    関連する問題