6가지 다른 프레임워크에서 ORF를 찾는 스크립트를 작성해 보세요.

6가지 다른 프레임워크에서 ORF를 찾는 스크립트를 작성해 보세요.

기본적으로 시퀀스가 ​​있습니다.

AAAGCATATGCTAGCCCGTATAGCGATACTAGCTATACGATATATATGATCAATGCCCGTATAG 

시퀀스에서 모든 "ORF"를 찾아야 합니다. ORF는 ATG로 시작하고 TGA, TAA 또는 TAG로 끝나는 모든 영역입니다.

예를 들어 위의 순서에서 ORF는 다음과 같습니다.

AAAGCAT**ATGCTAG**CCCGTATAGCGATACTAGCTATACGATATAT**ATGATCAATGCCCGTATAG** 

두 번째 ORF에는 ORF 내부에 ATG가 있다는 것을 알 수 있습니다. 이는 끝나기 전에 TGA, TAA 또는 TAG가 없을 때 발생합니다.

응, 그게 기본적으로 문제야. C++에는 2~3가지 방법이 있다는 것을 알고 있지만 bash의 구문에 관한 한 잘 모르겠습니다.

나는 라이브러리나 Perl 또는 그와 유사한 것을 사용할 수 없으며 특별한 기능도 없고 단지 grep, awk, sed 및 루프와 같은 것만 사용할 수 있습니다.

답변1

당신은 그것을 사용할 수 있습니다grep 만약에Perl 호환 정규식(PCRE) 옵션이 grep있는 GNU 버전을 사용하고 있습니다 .-P

또는 작성자의 pcregrep(일명)pgrep폴리 메라 제 연쇠 반응도서관. -P옵션을 지원하지 않고 업그레이드하거나 교체할 수 없는 이전 버전의 GNU grep 또는 비GNU grep을 사용하지 않는 한 지금은 이를 사용할 이유가 없습니다 .

예를 들어(시퀀스가 이름이 지정된 파일에 있다고 가정 input.txt):

$ grep -oP 'ATG.*?TA[AG]'  input.txt 
ATGCTAG
ATGATCAATGCCCGTATAG

-o옵션은 GNU grep에게 전체 줄이 아닌 일치하는 텍스트만 출력하도록 지시하고 -PPerl 호환 정규식을 사용하도록 지시합니다.

또는 다음을 사용하는 경우 pcregrep:

$ pcregrep -o 'ATG.*?TA[AG]'  input.txt 
ATGCTAG
ATGATCAATGCCCGTATAG

?정규식()의 non-greedy 수정자는 .*?캡처를 보장합니다.모두가장 긴 패턴뿐만 아니라 패턴도 일치시킵니다. 정규식의 맥락에서 "greedy"는 "최대한 많이 일치시키려고 노력함"(기본값)을 의미하고 "non-greedy"는 "가능한 한 적게 일치시키려고 노력함"을 의미합니다.

이에 대한 좋은 설명이 있습니다https://www.regular-expressions.info/repeat.html. 그런데 사이트의 나머지 부분은 많은 튜토리얼과 예제가 포함되어 있어 정규식을 배우기에 좋은 곳입니다.

대부분의 정규식 라이브러리는원하지 않는다GNU grep에서도 채택한 Perl 확장인 non-greedy 일치를 구현합니다. 그리고 그에 연결된 프로그램폴리 메라 제 연쇠 반응, 틀림없이.

그건 그렇고, 이것이 출력의 모습입니다아니요탐욕스럽지 않은 수정자:

$ grep -oP 'ATG.*TA[AG]'  input.txt 
ATGCTAGCCCGTATAGCGATACTAGCTATACGATATATATGATCAATGCCCGTATAG

답변2

검색 및 일치는 정규식을 사용하여 수행할 수 있습니다 perl(제가 가장 좋아하는 것은 sed필수 비탐욕적 정규식(p) 일치를 지원하지 않습니다).

# echo AAAGCATATGCTAGCCCGTATAGCGATACTAGCTATACGATATATATGATCAATGCCCGTATAG | perl -pe 's|(.*?)(ATG.*?TA[AG])(.*?)|\2\n|g'
ATGCTAG
ATGATCAATGCCCGTATAG
AA

여기서 perl명령은 마지막 줄 및 나머지 줄과 함께 요청한 시퀀스를 인쇄합니다. 정규식을 더 복잡하게 만들지 않으려면 수동으로 또는 다음 명령을 사용하여 쉽게 제거할 수 있습니다 head.

echo AAAGCATATGCTAGCCCGTATAGCGATACTAGCTATACGATATATATGATCAATGCCCGTATAGAA | perl -pe 's|(.*?)(ATG.*?TA[AG])(.*?)|\2\n|g' | head -n -1
ATGCTAG
ATGATCAATGCCCGTATAG

이러한 echo명령은 시퀀스에 대한 올바른 결과를 표시합니다. 한 파일에서 읽고 결과를 두 번째 파일로 보내려면 다음을 수행하십시오.

cat original_file | perl -pe 's|(.*?)(ATG.*?TA[AG])(.*?)|\2\n|g' | head -n -1 > new_file

original_file필터 패턴이 있는 소스 파일과 new_file대상 파일은 어디에 있습니까?

위의 내용은 headGNU coreutils의 "-n -1" 구문을 사용합니다. 이것이 효과가 없다면 시도해 보세요.

cat original_file | perl -pe 's|(.*?)(ATG.*?TA[AG])(.*?)|\2\n|g' | awk 'NR>1 {print prev} {prev=$0}' > new_file

답변3

이것은 bash에서 가능하지만 실제로는 좋은 도구는 아닙니다.

#!/bin/bash 

# Read the sequence into the variable $seq
seq=$1

## Check all three frames
for ((frame=0; frame<=3; frame++)); do
  ## Read the sequence in groups of 3
  for ((i=$frame;i<=${#seq};i+=3)); do
    ## The codon: three nucleotides starting from the current position.
    codon=${seq:i:3}
    ## set isORF to 1 if this is an ATG
    if [[ ${seq:i:3} = "ATG" ]]; then 
      isORF=1
    fi
    ## If we're in an ORF
    if [[ $isORF = 1 ]]; then
      ## Add this codon to the ORF's sequence
      ORF="${ORF}${codon}"
      ## Is this a STOP?
      if [[ ${seq:i:3} = "TGA" ||
            ${seq:i:3} = "TAA" ||
            ${seq:i:3} = "TAG" ]];
      then
        ## Print the ORF
        echo "ORF: $ORF"
        ## Set isORF to 0 and empty the ORF variable to repeat the process
        isORF=0
        ORF=""
    fi
  fi
  done
done

로 저장하고 foo.sh실행 가능하게 만든 후( chmod a+x foo.sh) 다음과 같이 실행합니다.

/path/to/foo.sh AAAGCATATGCTAGCCCGTATAGCGATACTAGCTATACGATATATATGATCAATGCCCGTATAG

관련 정보