ファイルから最初のn文字を抽出するgrepメソッド

ファイルから最初のn文字を抽出するgrepメソッド

を使用してファイルから一部のデータを抽出しようとしていますgrep

このファイルはDNA fastaファイルで、次の行が含まれています。

ATCGTAGCTAGCATCGTATCGATGCTGCTATGCTAGATGCTAGT

TA前の20文字をすべて検索する必要があります。TA

私は現在、以下を試しています。grep -E -o ".{0,20}TA"

TAただし、これは上の行に指定された文字列間の文字を提供する出力を生成します。たとえば、次のようになります。

TCGATGCTGCTA 
GCATCGTA 

TAこれは私が得たい2つの項目の間の文字列です。

TAGCATCGTATCGATGCTGCTA
TCGTATCGATGCTGCTATGCTA

検索文字列のインスタンスを含みます。

これを行う方法はありますかgrep

答え1

文字列が重複したいので、デフォルトでこれを提供できるツールはありません。重複するすべてのイベントを見つけるには、入力を繰り返す必要があります。次の問題は正規表現の貪欲な特性です。 aが見つかるATCGTAATCGTAGCTA先頭が見つかりません。これはループをより複雑にします。

sed -E ':1
 h;s/(.*TA).*/\1/
 s/.{0,20}TA$/_&/
 s/.*_//p
 g;s/(.*)TA.*/\1/;t1
 d

私が考えることができる最初の解決策です。この例の出力には、必要なすべてのシーケンスを含める必要があります。

GATGCTGCTATGCTAGATGCTA
TCGTATCGATGCTGCTATGCTA
TAGCATCGTATCGATGCTGCTA
ATCGTAGCTAGCATCGTA
ATCGTAGCTA
ATCGTA

説明:最後のゲームから始めるのは簡単です。

  • h次のサイクルのためにバッファをアーカイブスペースに保存する
  • s/(.*TA).*/\1/最後のもの以降のすべてを削除します。TA
  • s/.{0,20}TA$/_&/取得するシーケンスの先頭に下線をマーカーとして配置します。
  • s/.*_//pマーカーの前のすべての項目を削除し、シーケンスを印刷します。
  • 次のサイクルを準備するには、保存gしたパターンを復元し、s/(.*)TA.*/\1/最後のTAパターンとそれ以降のパターンを削除してもう一度見つからないようにします。
  • 最後に、シーケンスが見つかったらt1始めます。:1
  • d最後の偽の出力を抑制します。

答え2

与えられたシーケンスには3つのサブシーケンスだけがあり、その後には20の塩基がありますTA。これらはすべて重なっています。grepすべての部分文字列を見つけるには行を複数回移動する必要があるため、このユーティリティを使用して重複する文字列を抽出することはできません。

ATCGTAGCTAGCATCGTATCGATGCTGCTATGCTAGATGCTAGT
----TA--TA------TA----------TA---TA-----TA--
                    01234567890123456789
             01234567890123456789
        01234567890123456789

これらのシーケンスは、次のスクリプトsed(で使用するために作成されたsed -n)を使用して見つけることができます。

:again
s/\(.*.\{20\}TA\).*/\1/
h
s/.*\(.\{20\}TA\)/\1/p
g
s/TA$//
t again
  1. 最初のコマンドはラベルagainで、入力行の次のサブシーケンスを処理するために使用されます。
  2. 最初の置換は、最後の置換以降のすべてのシーケンスを削除しますTA
  3. h切り捨てられたシーケンスを「予約済みスペース」(の一時バッファ)に入れますsed
  4. 2番目の置換はシーケンスの最後の20塩基を見つけてTA印刷します。
  5. 予約済みスペースから以前に保存されたシーケンスを検索しますg(印刷したばかりのシーケンスを削除)。
  6. 3番目の置換はTA文字列の末尾から削除されます。
  7. 最新の代替項目が実際に何かを行った場合、tコマンドはそのラベルに移動します。again

テストしてみてください:

$ sed -n -f script.sed file
GATGCTGCTATGCTAGATGCTA
TCGTATCGATGCTGCTATGCTA
TAGCATCGTATCGATGCTGCTA

スクリプトの上にsed単一のコマンドを追加すると、どの入力行がどの出力を生成するかを表示することもできます。以下は、3行で繰り返されるデータを示しています。=sed

$ sed -n -f script.sed file
1
GATGCTGCTATGCTAGATGCTA
TCGTATCGATGCTGCTATGCTA
TAGCATCGTATCGATGCTGCTA
2
GATGCTGCTATGCTAGATGCTA
TCGTATCGATGCTGCTATGCTA
TAGCATCGTATCGATGCTGCTA
3
GATGCTGCTATGCTAGATGCTA
TCGTATCGATGCTGCTATGCTA
TAGCATCGTATCGATGCTGCTA

答え3

おそらく、重複する一致を取得する方法があるかもしれませんがgrep -o(何も知らず、認識していませんgrep -Po)、その間に以下を使用できますawk

echo ATCGTAGCTAGCATCGTATCGATGCTGCTATGCTAGATGCTAGT |
awk '{
   i=0; for(s=$0; j = index(s,"TA"); s = substr($0, i + 1))
            print ((i += j) > 20) ? substr($0, i - 20, 22) : substr($0, 1, i+1)
}'

ATCGTA
ATCGTAGCTA
ATCGTAGCTAGCATCGTA
TAGCATCGTATCGATGCTGCTA
TCGTATCGATGCTGCTATGCTA
GATGCTGCTATGCTAGATGCTA

文字列の先頭から短い一致を望まない場合は、次のように単純化します。

echo ATCGTAGCTAGCATCGTATCGATGCTGCTATGCTAGATGCTAGT |
awk '{
    i=0; for(s=$0; j = index(s,"TA"); s = substr($0, i + 1))
             if((i += j) > 20) print substr($0, i - 20, 22)
}'

TAGCATCGTATCGATGCTGCTA
TCGTATCGATGCTGCTATGCTA
GATGCTGCTATGCTAGATGCTA

同じものperl

echo ATCGTAGCTAGCATCGTATCGATGCTGCTATGCTAGATGCTAGT |
perl -nle 'print $-[0] > 20 ? substr $_, $-[0]-20, 22 : substr $_, 0, $+[0] while /TA/g'

ATCGTA
ATCGTAGCTA
ATCGTAGCTAGCATCGTA
TAGCATCGTATCGATGCTGCTA
TCGTATCGATGCTGCTATGCTA
GATGCTGCTATGCTAGATGCTA


echo ATCGTAGCTAGCATCGTATCGATGCTGCTATGCTAGATGCTAGT |
perl -nle 'pos() -= 21, print $1 while /(.{20}TA)/g'

TAGCATCGTATCGATGCTGCTA
TCGTATCGATGCTGCTATGCTA
GATGCTGCTATGCTAGATGCTA

このバージョンを使用するとmawk(Debianのデフォルト値のように)、awkより速くなります。

sedどんなソリューションでも優れた能力を実証するとともに、sed多くの利点を提供するしかありません。サイズまたは。perlawk

関連情報