한 파일에서 다른 파일로 여러 줄 복사

한 파일에서 다른 파일로 여러 줄 복사

/protein_id=표시된 단백질 시퀀스가 ​​끝날 때까지 줄 사이에 있는 모든 줄을 한 파일에서 다른 파일로 복사하기 위해 grep을 사용하고 싶습니다 . 예를 들어 다음 입력에서:

 CDS             448..1269
                 /gene="nptII"
                 /note="neomycin phosphotransferase II"
                 /codon_start=1
                 /product="kanamycin resistance protein"
                 /protein_id="AAQ05967.1"
                 /db_xref="GI:33320494"
                 /translation="MAITLSATSLPISARIRAGSPAAWVERLFGYDWAQQTIGCSDAA
                 VFRLSAQGRPVLFVKTDLSGALNELQDEAARLSWLATTGVPCAAVLDVVTEAGRDWLL
                 LGEVPGQDLLSSHLAPAEKVSIMADAMRRLHTLDPATCPFDHQAKHRIERARTRMEAG
                 LVDQDDLDEEHQGLAPAELFARLKARMPDGEDLVVTHGDACLPNIMVENGRFSGFIDC
                 GRLGVADRYQDIALATRDIAEELGGEWADRFLVLYGIAAPDSQRIAFYRLLDEFF"
  regulatory      1443..2148

나는 다음과 같은 출력을 원합니다.

                 /protein_id="AAQ05967.1"
                 /db_xref="GI:33320494"
                 /translation="MAITLSATSLPISARIRAGSPAAWVERLFGYDWAQQTIGCSDAA
                 VFRLSAQGRPVLFVKTDLSGALNELQDEAARLSWLATTGVPCAAVLDVVTEAGRDWLL
                 LGEVPGQDLLSSHLAPAEKVSIMADAMRRLHTLDPATCPFDHQAKHRIERARTRMEAG
                 LVDQDDLDEEHQGLAPAELFARLKARMPDGEDLVVTHGDACLPNIMVENGRFSGFIDC
                 GRLGVADRYQDIALATRDIAEELGGEWADRFLVLYGIAAPDSQRIAFYRLLDEFF"

regulatory로 시작하는 줄이 다른 것으로 대체될 수 있다는 점에서 입력이 달라질 수 있습니다 . 변하지 않는 점은 시퀀스가 ​​대문자로 제공되고 ". grep으로 가능합니까?

답변1

pcregrepPerl 5 호환 정규 표현식을 사용하는 grep 유틸리티입니다. Perl 스타일 정규 표현식에는 표준 POSIX 정규 표현식에는 없는 유용한 기능이 많이 있습니다. 이는 기본적으로 grep과 동일하지만 정규식 구문이 다릅니다.

sudo apt-get install pcregrep  
pcregrep -M .*'/protein_id=.*(\n|.)*\"' path/to/input-file 

/protein_id는 시작 검색어이고 "는 최종 검색어입니다.

다음은 시작 검색어와 끝 검색어 사이에 있는 모든 줄에 대해 여러 줄 검색을 수행하는 명령의 일반화된 예입니다.

pcregrep -M .*'START-SEARCH-TERM.*(\n|.)*END-SEARCH-TERM' path/to/SOURCE-FILE >> path/to/DESTINATION-FILE  

어디:

  • SOURCE-FILE은 데이터가 포함된 파일입니다.
  • DESTINATION-FILE은 결과가 복사될 파일입니다.
  • START-SEARCH-TERM은 시작 검색어입니다.
  • END-SEARCH-TERM은 최종 검색어입니다.
  • -M, --multiline패턴이 두 줄 이상 일치하도록 허용합니다.

답변2

아니요, grep여러 줄에 걸쳐 일치할 수 없습니다. pcregrep@karel이 보여준 대로 할 수 있지만 pure는 아닙니다 grep. 대신, 단백질 서열이 항상 대문자이고 로 끝날 것이라는 것을 알고 있으므로 "다음과 같이 일치시킬 수 있습니다.

  1. sed

    sed -n '/\/protein_id=/,/^\s*[[:upper:]]\+"\s*$/{p}' two_seq.txt
    

    패턴 sed/foo/,/bar/{p}" foo와 사이의 모든 행을 인쇄한다는 의미입니다 bar. -n일반 출력을 억제하여 요청된 행만 인쇄합니다. /of는 일치 연산자의 일부 이므로 이스케이프( ) /protein_id=해야 합니다 . 두 번째 패턴은 좀 더 복잡합니다. 줄 시작 부분에서 0개 이상의 공백( )을 찾은 다음 하나 이상의 대문자와 큰따옴표( ), 줄 끝( )까지 0개 이상의 공백 문자를 찾습니다 .\//^\s*[[:upper:]]"\s*$

  2. perl -ne 'print if m#/protein_id=# ... m#[A-Z]+"\s*$#' file.flat 
    

    여기서도 동일한 아이디어로 ...연산자는 범위를 지정하고 두 패턴 사이의 선이 인쇄됩니다.

  3. awk

    awk '/\/protein_id=/{a=1}; a==1{print} /^\s*[[:upper:]]+"\s*$/{a=0}' file.flat 
    

    여기서는 행이 첫 번째 패턴과 일치하는 경우와 마지막 패턴과 일치하는 경우 a로 변수를 설정합니다 . 그런 다음 is 인 경우 인쇄하라고 지시합니다 . 두 번째 패턴에 대해 이전 호출이 로 설정되어 있으므로 여기에는 두 번째 패턴을 포함하는 줄도 포함됩니다.10awka1printa0

관련 정보