2016-04-20 14 views
-1

特定の行とそれに続くシーケンシングデータを抽出したいと思います。linuxコマンドを使用してシーケンシングデータを抽出する方法

次のようにecoli.ffnファイルがあります:

私は何をしたいのか

$head index.txt 
g000011 
g000012 

を次のように

$head ecoli.ffn 
>ecoli16:g027092:GCF_000460315:gi|545267691|ref|NZ_KE701669.1|:551259-572036 
ATGAGCCTGATTATTGATGTTATTTCGCGT 
AAAACATCCGTCAAACAAACGCTGATTAAT 
>ecoli16:g000011:55989:gi|218693476|ref|NC_011748.1|:1128430-1131042 
GTGTACGCTATGGCGGGTAATTTTGCCGAT 
>ecoli16:g000012:55989:gi|218693476|ref|NC_011748.1|:1128430-1131042 
GTGTACGCTATGGCGGGTAATTTTGCCGAT 
CTGACAGCTGTTCTTACACTGGATTCAACC 
CTGACAGCTGTTCTTACACTGGATTCAACC 

とindex.txtのは "ecoli.ffnからindex.txtの抽出" で、理想的な出力は次のとおりです。

>ecoli16:g000011:55989:gi|218693476|ref|NC_011748.1|:1128430-1131042 
GTGTACGCTATGGCGGGTAATTTTGCCGAT 
>ecoli16:g000012:55989:gi|218693476|ref|NC_011748.1|:1128430-1131042 
GTGTACGCTATGGCGGGTAATTTTGCCGAT 
CTGACAGCTGTTCTTACACTGGATTCAACC 
CTGACAGCTGTTCTTACACTGGATTCAACC 

どうすればいいですか?

答えて

1

を与えるためにはawkを使用して簡単なスクリプトecoli.shを書く:

#!/bin/bash 
a=`cat index.txt` 
for i in $a 
do 
    cat ecoli.ffn|awk -F: -v i="$i" 'BEGIN{flag=0} {if($2 == i){print $0;flag=1;} if(flag ==1 && $2 != i){print $0; flag=0;} }' 
done 

あなたはあなたのシェルでこのスクリプトを実行する必要があります。

+0

にもう一つ質問があります。ありがとう、guodongxiaren。しかし、あなたのやり方では、最初の列の順序データだけが抽出されます。 545267691 | | REF | NZ_KE701669.1 | GI:: '> ecoli16:g027092:GCF_000460315実際には、本当のecoli.ffnは次のように実際には551259から572036 ATGAGCCTGATTATTGATGTTATTT CGCGTAAAACATCCGTCAAACAAAC GCTGATTAATGGATTCAACCGGATT > ecoli16:g000011:55989: gi | 218693476 | ref | NC_011748。1 |:1128430から1131042 GTGTACGCTATGGCGGGTAATTTTG CCGATCTGACAGCTGTTCTTACACT GGATTCAACCGGATTCAACCGGATT > ecoli16:g000012:55989:GI | 218693476 | REF | NC_011748.1 |:1128430から1131042 GTGTACGCTATGGCGGGTAATTTTG CCGATCTGACAGCTGTTCTTACACT ' – Ming

+0

いくつかの提案:' BEGIN {flag = 0} 'は役に立たず、削除することができます。 '$ 2 == i {print; $ {print $ 0; flag = 1;}'は '$ 2 == i {print;フラグ= 1} 'を生成する。それにもかかわらず、私はこれが質問の正しい答えだとは思わない。 – karakfa

1

awkレスキュー!これは、各レコードのためにそこにあるどのように多くの行に依存しないこと

$ awk -F: -v RS=">" 'NR==FNR{n=split($0,t,"\n"); 
          for(i=1;i<n;i++) a[t[i]]; 
          next} 
        $2 in a{printf "%s", RS $0}' index file 

>ecoli16:g000011:55989:gi|218693476|ref|NC_011748.1|:1128430-1131042 
GTGTACGCTATGGCGGGTAATTTTGCCGATCTGACAGCTGTTCTTACACTGGATTCAACC 
>ecoli16:g000012:55989:gi|218693476|ref|NC_011748.1|:1128430-1131042 
GTGTACGCTATGGCGGGTAATTTTGCCGATCTGACAGCTGTTCTTACACTGGATTCAACC 

UPDATE 注意。更新された入力ファイル、同じスクリプトがあなたにこの出力

$ awk -F: -v RS=">" 'NR==FNR{n=split($0,t,"\n"); 
          for(i=1;i<n;i++) a[t[i]]; 
          next} 
        $2 in a{printf "%s", RS $0}' index file 

>ecoli16:g000011:55989:gi|218693476|ref|NC_011748.1|:1128430-1131042 
GTGTACGCTATGGCGGGTAATTTTGCCGAT 
>ecoli16:g000012:55989:gi|218693476|ref|NC_011748.1|:1128430-1131042 
GTGTACGCTATGGCGGGTAATTTTGCCGAT 
CTGACAGCTGTTCTTACACTGGATTCAACC 
CTGACAGCTGTTCTTACACTGGATTCAACC 
+0

おかげで、karakfa。それは今働く。しかし、それは各遺伝子配列の最初の行を抽出することしかできません。実際のケースは、各遺伝子に対して2つ以上の系列の配列が存在することである。いくつかの遺伝子は1つの系統を有するので、他の系統は3系統以上の系統を有し得る。この場合、どのように救助するのですか?再度、感謝します。 – Ming

+0

'> 'はインジケータなので、そこに何行あるかは関係ありません。あなたのテストがそうでなければ、正しく動作しないケースの例を投稿してください。 – karakfa

+0

私はちょうど質問を更新しました。その場合、 'ecoli16:g000011:55989:gi | 218693476 | ref | NC_011748.1 |:1128430-1131042 GTGTACGCTATGGCGGGTAATTTTGCCGAT > ecoli16:g000012:55989:gi | 218693476 | ref | NC_011748.1 | :1128430-1131042 GTGTACGCTATGGCGGGTAATTTTGCCGAT ' – Ming

関連する問題