シーケンススキャンとサブシーケンス出力

シーケンススキャンとサブシーケンス出力

可能であれば、そのためのライナーを探しています。このような順序があります。

CCGGTCTCTTCCGGTTCTGTCTTTTCGCTGG

シーケンスをベースごとにスキャンして20bpを抽出する出力を得たいと思います。したがって、出力は次のようになります

CCGGTCTCTTCCGGTTCTGT
CGGTCTCTTCCGGTTCTGTC
GGTCTCTTCCGGTTCTGTCT

など..長さは常に20bpでなければなりません。

Perlコードを書いたところ、うまくいきます。ライナーを探していますが、awkやsedを使用するのに役立つ人がいますか?

while(<>){
    chomp;
    for my $i(0..length($_)){
        my $str = substr($_,$i,20);
        next if(length($str) < 20);
        print $str,"\n";
    }

}

教えてください

答え1

私が正しく理解したと仮定すると、awkこれは次のようになります。

awk -v s=CCGGTCTCTTCCGGTTCTGTCTTTTCGCTGG '
  BEGIN{while (length(x=substr(s, ++i, 20)) == 20) {print x} exit}'
CCGGTCTCTTCCGGTTCTGT
CGGTCTCTTCCGGTTCTGTC
GGTCTCTTCCGGTTCTGTCT
GTCTCTTCCGGTTCTGTCTT
TCTCTTCCGGTTCTGTCTTT
CTCTTCCGGTTCTGTCTTTT
TCTTCCGGTTCTGTCTTTTC
CTTCCGGTTCTGTCTTTTCG
TTCCGGTTCTGTCTTTTCGC
TCCGGTTCTGTCTTTTCGCT
CCGGTTCTGTCTTTTCGCTG
CGGTTCTGTCTTTTCGCTGG

答え2

バージョンのみbash

s=CCGGTCTCTTCCGGTTCTGTCTTTTCGCTGG
for ((i=0; i < ${#s} - 20; i++))
do 
  echo ${s:i:20}
done

CCGGTCTCTTCCGGTTCTGT
CGGTCTCTTCCGGTTCTGTC
GGTCTCTTCCGGTTCTGTCT
GTCTCTTCCGGTTCTGTCTT
TCTCTTCCGGTTCTGTCTTT
CTCTTCCGGTTCTGTCTTTT
TCTTCCGGTTCTGTCTTTTC
CTTCCGGTTCTGTCTTTTCG
TTCCGGTTCTGTCTTTTCGC
TCCGGTTCTGTCTTTTCGCT
CCGGTTCTGTCTTTTCGCTG

ループは、i0から「sの長さ」から20を引いた値までのインデックスを取得し、そのインデックスから始まり、「s」の20文字を印刷します。

厳密に言えば、一行で:

s=CCGGTCTCTTCCGGTTCTGTCTTTTCGCTGG; for ((i=0; i < ${#s} - 20; i++)); do echo ${s:i:20}; done

答え3

sed -n '
  /.\{21,\}/ {
    h
    s/.//
    H
    x
  }
  s/\(.\{,20\}\).*\n/\1\n/
  P
  D
' <<< "CCGGTCTCTTCCGGTTCTGTCTTTTCGCTGG"
CCGGTCTCTTCCGGTTCTGT
CGGTCTCTTCCGGTTCTGTC
GGTCTCTTCCGGTTCTGTCT
GTCTCTTCCGGTTCTGTCTT
TCTCTTCCGGTTCTGTCTTT
CTCTTCCGGTTCTGTCTTTT
TCTTCCGGTTCTGTCTTTTC
CTTCCGGTTCTGTCTTTTCG
TTCCGGTTCTGTCTTTTCGC
TCCGGTTCTGTCTTTTCGCT
CCGGTTCTGTCTTTTCGCTG
CGGTTCTGTCTTTTCGCTGG

「一行」バージョンは次のとおりです。

sed -n -e '/.\{21,\}/ {h;s/.//;H;x}' -e 's/\(.\{,20\}\).*\n/\1\n/' -e 'P;D' <<< "CCGGTCTCTTCCGGTTCTGTCTTTTCGCTGG"

または(拡張構文を使用すると少し読みやすくなります)

sed -nE -e '/.{21,}/ {h;s/.//;H;x}' -e 's/(.{,20}).*\n/\1\n/' -e 'P;D' <<< "CCGGTCTCTTCCGGTTCTGTCTTTTCGCTGG"

または、sedを使用してすべての操作を実行したくない場合

sed -nE \
  -e '/.{21,}/ {h;s/.//;H;x}' -e 'P;D' <<< "CCGGTCTCTTCCGGTTCTGTCTTTTCGCTGG" \
| cut -c-20

答え4

sed -ne:20 -e's/./&\n/20;/\n/{P;s///;s/.//;}' -et20

sedこの質問を受けるとうまくいきます。


CCGGTCTCTTCCGGTTCTGT
CGGTCTCTTCCGGTTCTGTC
GGTCTCTTCCGGTTCTGTCT
GTCTCTTCCGGTTCTGTCTT
TCTCTTCCGGTTCTGTCTTT
CTCTTCCGGTTCTGTCTTTT
TCTTCCGGTTCTGTCTTTTC
CTTCCGGTTCTGTCTTTTCG
TTCCGGTTCTGTCTTTTCGC
TCCGGTTCTGTCTTTTCGCT
CCGGTTCTGTCTTTTCGCTG
CGGTTCTGTCTTTTCGCTGG

しかし、他の人のように見えます。それは簡単ですsed- パターンスペースに少なくとも20文字がある限り、20番目の文字に改行を追加し、改行として印刷し、改行と最初の文字を削除してから、再びパターンスペースにループバックします。

場合によっては、以下の代替引用符の代わりにsedリテラル改行を使用したい場合があります。正直なところ、これは最善の方法ですが、Webページにこの種のコンテンツを表示するのは難しいです。n&

関連情報