![扫描序列并输出子序列](https://linux22.com/image/80732/%E6%89%AB%E6%8F%8F%E5%BA%8F%E5%88%97%E5%B9%B6%E8%BE%93%E5%87%BA%E5%AD%90%E5%BA%8F%E5%88%97.png)
如果可能的话,我正在为此寻找一款内衬。我有一个这样的序列
CCGGTCTCTTCCGGTTCTGTCTTTTCGCTGG
我想要得到输出,我逐个碱基扫描序列,然后从中取出 20 bp。所以输出应该是这样的
CCGGTCTCTTCCGGTTCTGT
CGGTCTCTTCCGGTTCTGTC
GGTCTCTTCCGGTTCTGTCT
等等..长度应始终为 20 bp
我写了一个 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
仅Abash
版本:
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
从零到“s 的长度”减 20 的索引,并从该索引开始打印 20 个字符的“s”。
严格在一行:
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
,您可能需要使用文字换行符来代替n
下面的&
替换引用 - 老实说,这是最好的方法,但在网页上显示此类内容比较困难。