시퀀스 스캔 및 하위 시퀀스 출력

시퀀스 스캔 및 하위 시퀀스 출력

가능하다면 이에 대한 라이너를 찾고 있습니다. 이런 순서가 있어요

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대신 리터럴 줄 바꿈을 사용하고 싶을 수도 있습니다 . 솔직히 이것이 가장 좋은 방법이지만 웹 페이지에 이런 종류의 콘텐츠를 표시하는 것이 더 어렵습니다.n&

관련 정보