
を使用してファイルから一部のデータを抽出しようとしていますgrep
。
このファイルはDNA fastaファイルで、次の行が含まれています。
ATCGTAGCTAGCATCGTATCGATGCTGCTATGCTAGATGCTAGT
TA
前の20文字をすべて検索する必要があります。TA
私は現在、以下を試しています。grep -E -o ".{0,20}TA"
TA
ただし、これは上の行に指定された文字列間の文字を提供する出力を生成します。たとえば、次のようになります。
TCGATGCTGCTA
GCATCGTA
TA
これは私が得たい2つの項目の間の文字列です。
TAGCATCGTATCGATGCTGCTA
TCGTATCGATGCTGCTATGCTA
検索文字列のインスタンスを含みます。
これを行う方法はありますかgrep
?
答え1
文字列が重複したいので、デフォルトでこれを提供できるツールはありません。重複するすべてのイベントを見つけるには、入力を繰り返す必要があります。次の問題は正規表現の貪欲な特性です。 aが見つかるATCGTA
とATCGTAGCTA
先頭が見つかりません。これはループをより複雑にします。
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
- 最初のコマンドはラベル
again
で、入力行の次のサブシーケンスを処理するために使用されます。 - 最初の置換は、最後の置換以降のすべてのシーケンスを削除します
TA
。 h
切り捨てられたシーケンスを「予約済みスペース」(の一時バッファ)に入れますsed
。- 2番目の置換はシーケンスの最後の20塩基を見つけて
TA
印刷します。 - 予約済みスペースから以前に保存されたシーケンスを検索します
g
(印刷したばかりのシーケンスを削除)。 - 3番目の置換は
TA
文字列の末尾から削除されます。 - 最新の代替項目が実際に何かを行った場合、
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
多くの利点を提供するしかありません。サイズまたは。perl
awk