/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
pcregrep
Perl 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
. 대신, 단백질 서열이 항상 대문자이고 로 끝날 것이라는 것을 알고 있으므로 "
다음과 같이 일치시킬 수 있습니다.
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*$
펄
perl -ne 'print if m#/protein_id=# ... m#[A-Z]+"\s*$#' file.flat
여기서도 동일한 아이디어로
...
연산자는 범위를 지정하고 두 패턴 사이의 선이 인쇄됩니다.awk
awk '/\/protein_id=/{a=1}; a==1{print} /^\s*[[:upper:]]+"\s*$/{a=0}' file.flat
여기서는 행이 첫 번째 패턴과 일치하는 경우와 마지막 패턴과 일치하는 경우
a
로 변수를 설정합니다 . 그런 다음 is 인 경우 인쇄하라고 지시합니다 . 두 번째 패턴에 대해 이전 호출이 로 설정되어 있으므로 여기에는 두 번째 패턴을 포함하는 줄도 포함됩니다.1
0
awk
a
1
print
a
0