기본적으로 시퀀스가 있습니다.
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에게 전체 줄이 아닌 일치하는 텍스트만 출력하도록 지시하고 -P
Perl 호환 정규식을 사용하도록 지시합니다.
또는 다음을 사용하는 경우 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
대상 파일은 어디에 있습니까?
위의 내용은 head
GNU 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