扫描序列并输出子序列

扫描序列并输出子序列

如果可能的话,我正在为此寻找一款内衬。我有一个这样的序列

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下面的&替换引用 - 老实说,这是最好的方法,但在网页上显示此类内容比较困难。

相关内容