를 사용하여 파일에서 일부 데이터를 추출하려고 합니다 grep
.
이 파일은 DNA fasta 파일이며 다음 줄을 포함합니다.
ATCGTAGCTAGCATCGTATCGATGCTGCTATGCTAGATGCTAGT
TA
앞에 있는 20자를 모두 찾아야 합니다 .TA
나는 현재 다음을 시도하고 있습니다.grep -E -o ".{0,20}TA"
TA
그러나 이는 위 줄에 제공된 문자열 사이의 문자를 제공하는 출력을 생성합니다 . 예를 들면 다음과 같습니다.
TCGATGCTGCTA
GCATCGTA
TA
이것은 내가 얻고 싶은 두 항목 사이의 문자열입니다 .
TAGCATCGTATCGATGCTGCTA
TCGTATCGATGCTGCTATGCTA
검색 문자열의 인스턴스를 포함합니다.
이를 수행할 수 있는 방법이 있습니까 grep
?
답변1
문자열이 겹치기를 원하기 때문에 기본적으로 이를 제공할 수 있는 도구는 없습니다. 겹치는 모든 이벤트를 찾으려면 입력을 반복해야 합니다. 다음 문제는 정규식의 탐욕스러운 특성입니다. a를 찾을 수 ATCGTA
있으면 ATCGTAGCTA
선두를 찾을 수 없습니다. 이는 루프를 더욱 복잡하게 만듭니다.
sed -E ':1
h;s/(.*TA).*/\1/
s/.{0,20}TA$/_&/
s/.*_//p
g;s/(.*)TA.*/\1/;t1
d
내가 생각할 수있는 첫 번째 솔루션입니다. 이 예제의 출력에는 원하는 모든 시퀀스가 포함되어야 합니다.
GATGCTGCTATGCTAGATGCTA
TCGTATCGATGCTGCTATGCTA
TAGCATCGTATCGATGCTGCTA
ATCGTAGCTAGCATCGTA
ATCGTAGCTA
ATCGTA
설명: 마지막 게임부터 시작하는 것이 더 쉬울 것 같아서
h
다음 사이클을 위해 버퍼를 보관 공간에 저장s/(.*TA).*/\1/
마지막 것 이후의 모든 것을 삭제하십시오.TA
s/.{0,20}TA$/_&/
얻으려는 시퀀스의 시작 부분에 밑줄을 마커로 배치하십시오.s/.*_//p
마커 앞의 모든 항목을 제거하고 시퀀스를 인쇄합니다.- 다음 사이클을 준비하려면
g
저장된 패턴을 복원하고s/(.*)TA.*/\1/
마지막TA
패턴과 이후 패턴을 삭제하여 다시 찾을 수 없도록 하세요. - 마지막으로 시퀀스가 발견되면
t1
시작합니다 .:1
d
마지막 가짜 출력을 억제합니다.
답변2
주어진 시퀀스에는 3개의 하위 시퀀스만 있고 그 뒤에는 20개의 염기가 있습니다 TA
. 이것들은 모두 겹칩니다. grep
모든 하위 문자열을 찾으려면 행을 여러 번 탐색해야 하기 때문에 이 유틸리티를 사용하여 겹치는 문자열을 추출할 수 없습니다.
ATCGTAGCTAGCATCGTATCGATGCTGCTATGCTAGATGCTAGT
----TA--TA------TA----------TA---TA-----TA--
01234567890123456789
01234567890123456789
01234567890123456789
이러한 시퀀스는 다음 스크립트 sed
( 와 함께 사용하도록 작성됨 sed -n
)를 사용하여 찾을 수 있습니다.
:again
s/\(.*.\{20\}TA\).*/\1/
h
s/.*\(.\{20\}TA\)/\1/p
g
s/TA$//
t again
- 첫 번째 명령은 label
again
이며 입력 라인의 다음 하위 시퀀스를 처리하는 데 사용됩니다. - 첫 번째 대체는 마지막 대체 이후의 모든 시퀀스를 삭제합니다
TA
. h
잘린 시퀀스를 "예약된 공간"( 의 임시 버퍼)에 넣습니다sed
.- 두 번째 치환은 시퀀스의 마지막 20개 염기를 찾아서
TA
인쇄합니다. - 예약된 공간에서 이전에 저장된 시퀀스를 검색합니다
g
(방금 인쇄된 시퀀스 삭제). - 세 번째 대체는
TA
문자열 끝에서 제거됩니다. - 가장 최근의 대체 항목이 실제로 어떤 작업을 수행한 경우
t
명령은 해당 레이블로 이동합니다.again
테스트해보세요:
$ sed -n -f script.sed file
GATGCTGCTATGCTAGATGCTA
TCGTATCGATGCTGCTATGCTA
TAGCATCGTATCGATGCTGCTA
스크립트 맨 위에 sed
단일 명령을 추가 하면 어떤 입력 줄이 어떤 출력을 생성하는지 표시할 수도 있습니다. 다음은 세 행에서 반복되는 데이터를 보여줍니다.=
sed
$ sed -n -f script.sed file
1
GATGCTGCTATGCTAGATGCTA
TCGTATCGATGCTGCTATGCTA
TAGCATCGTATCGATGCTGCTA
2
GATGCTGCTATGCTAGATGCTA
TCGTATCGATGCTGCTATGCTA
TAGCATCGTATCGATGCTGCTA
3
GATGCTGCTATGCTAGATGCTA
TCGTATCGATGCTGCTATGCTA
TAGCATCGTATCGATGCTGCTA
답변3
아마도 겹치는 일치 항목을 얻는 방법이 있을 수 있지만 grep -o
(아무 것도 모르고 심지어 인식하지도 못함 grep -Po
) 그 동안 다음을 사용할 수 있습니다 awk
.
echo ATCGTAGCTAGCATCGTATCGATGCTGCTATGCTAGATGCTAGT |
awk '{
i=0; for(s=$0; j = index(s,"TA"); s = substr($0, i + 1))
print ((i += j) > 20) ? substr($0, i - 20, 22) : substr($0, 1, i+1)
}'
ATCGTA
ATCGTAGCTA
ATCGTAGCTAGCATCGTA
TAGCATCGTATCGATGCTGCTA
TCGTATCGATGCTGCTATGCTA
GATGCTGCTATGCTAGATGCTA
문자열의 시작 부분부터 더 짧은 일치를 원하지 않으면 다음과 같이 단순화하십시오.
echo ATCGTAGCTAGCATCGTATCGATGCTGCTATGCTAGATGCTAGT |
awk '{
i=0; for(s=$0; j = index(s,"TA"); s = substr($0, i + 1))
if((i += j) > 20) print substr($0, i - 20, 22)
}'
TAGCATCGTATCGATGCTGCTA
TCGTATCGATGCTGCTATGCTA
GATGCTGCTATGCTAGATGCTA
같은 것 perl
:
echo ATCGTAGCTAGCATCGTATCGATGCTGCTATGCTAGATGCTAGT |
perl -nle 'print $-[0] > 20 ? substr $_, $-[0]-20, 22 : substr $_, 0, $+[0] while /TA/g'
ATCGTA
ATCGTAGCTA
ATCGTAGCTAGCATCGTA
TAGCATCGTATCGATGCTGCTA
TCGTATCGATGCTGCTATGCTA
GATGCTGCTATGCTAGATGCTA
echo ATCGTAGCTAGCATCGTATCGATGCTGCTATGCTAGATGCTAGT |
perl -nle 'pos() -= 21, print $1 while /(.{20}TA)/g'
TAGCATCGTATCGATGCTGCTA
TCGTATCGATGCTGCTATGCTA
GATGCTGCTATGCTAGATGCTA
이 버전을 사용하면 mawk
(데비안의 기본값처럼) awk
더 빨라집니다 .
sed
어떤 솔루션 이든 뛰어난 능력을 입증하는 동시에 sed
많은 이점을 제공할 수밖에 없습니다.크기또는 perl
.awk