
可能であれば、そのためのライナーを探しています。このような順序があります。
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
ループは、i
0から「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
&