파일에서 처음 n 문자를 추출하는 grep 방법

파일에서 처음 n 문자를 추출하는 grep 방법

를 사용하여 파일에서 일부 데이터를 추출하려고 합니다 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
  1. 첫 번째 명령은 label again이며 입력 라인의 다음 하위 시퀀스를 처리하는 데 사용됩니다.
  2. 첫 번째 대체는 마지막 대체 이후의 모든 시퀀스를 삭제합니다 TA.
  3. h잘린 시퀀스를 "예약된 공간"( 의 임시 버퍼)에 넣습니다 sed.
  4. 두 번째 치환은 시퀀스의 마지막 20개 염기를 찾아서 TA인쇄합니다.
  5. 예약된 공간에서 이전에 저장된 시퀀스를 검색합니다 g(방금 인쇄된 시퀀스 삭제).
  6. 세 번째 대체는 TA문자열 끝에서 제거됩니다.
  7. 가장 최근의 대체 항목이 실제로 어떤 작업을 수행한 경우 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

관련 정보