아미노산 및 잔류 데이터를 제공하는 여러 줄이 포함된 .txt 파일이 있습니다. 데이터는 다음과 같습니다:
ARG262-Side ASP368-Side 140,83%
ARG95-Side GLU107-Side 103,73%
ARG474-Side VAL468-Main 94,93%
PHE169-Main ALA190-Main 94,63%
THR205-Side ASP203-Side 94,07%
ILE299-Main LYS249-Main 94%
LEU354-Main LYS365-Main 93,6%
ARG346-Side GLU263-Side 93,57%
LEU301-Main ALA247-Main 93,43%
ALA190-Main PHE169-Main 93,37%
SER252-Side ASP296-Side 93,1%
TYR424-Side ASN446-Main 93%
숫자는 잔기를 나타내고 문자는 아미노산을 나타낸다고 대략적으로 말할 수 있습니다. 따라서 각 행의 첫 번째 및 두 번째 필드에서 이전 부분은 -
아미노산 식별자와 잔기 값으로 구성됩니다. 아미노산에 상관없이, 그리고 첫 번째 또는 두 번째 필드가 기준을 충족하는지 여부에 관계없이 눈에 보이는 잔류 값이 특정 범위 내에 있는 행만 인쇄하고 싶습니다.
예를 들어, 위의 입력 파일에서 다음 사이의 나머지만 포함하는 데이터를 추출하고 싶습니다.300-425. 이 경우 내 출력은 다음과 같아야 합니다.
ARG262-Side ASP368-Side 140,83%
LEU354-Main LYS365-Main 93,6%
ARG346-Side GLU263-Side 93,57%
LEU301-Main ALA247-Main 93,43%
TYR424-Side ASN446-Main 93%
나는 이 grep
명령을 사용하여 많은 성공을 거두지 못했습니다. 이것 외에 사용할 수 있는 명령이 있나요 grep
?
답변1
사용 awk
:
awk -F'(^| )...|-' '$2>300 && $2<425 || $4>300 && $4<425' infile
여기서는 필드 구분 기호를 다음과 같이 설정합니다.
- 줄의 시작 뒤에 3개의 문자가 옵니다
^...
. 또는 - 공백 뒤에 3개의 문자가 옵니다
...
. 또는 - 하이픈
그러면 이를 바탕으로 2열과 4열이 아미노산의 잔기이므로 주어진 범위 내에 있는지 확인합니다.
답변2
주로 정규식을 다루는 도구가 숫자를 다루는 데는 좋지 않다는 것은 잘 알려져 있습니다. 이 경우 awk
대신 다음과 같은 것을 사용하는 것이 좋습니다 grep
.
$ awk '{ r1 = substr($1,4,3); r2 = substr($2,4,3) } (r1 >= 300 && r1 <= 425) || (r2 >= 300 && r2 <= 425)' file
ARG262-Side ASP368-Side 140,83%
LEU354-Main LYS365-Main 93,6%
ARG346-Side GLU263-Side 93,57%
LEU301-Main ALA247-Main 93,43%
TYR424-Side ASN446-Main 93%
코드 awk
는 각 줄의 공백으로 구분된 처음 두 필드에서 오프셋 4에서 시작하는 트리 문자를 추출하고 이를 r1
sum 이라고 부릅니다 r2
. 저는 필드 데이터의 고정 위치에서 숫자를 추출했지만 substr()
, 관심 있는 숫자만 확실하다면 숫자가 아닌 모든 숫자를 제거할 수도 있습니다. 이 방법
r1 = $1; gsub("[^[:digit:]]", "", r1)
유사하게 r2
사용됩니다 $2
.
끝의 조건이 true이면 현재 줄이 인쇄됩니다.
답변3
이 시도:
grep -E '[^0-9](3[0-9][0-9]|4[01][0-9]|42[0-5])-' file`
-E
확장 정규식 활성화(백슬래시 대괄호 및 파이프 필요 없음)[^0-9](
-- 숫자가 아닌 것, 그 뒤에3[0-9][0-9]|
300에서 399 사이의 숫자 또는4[01][0-9]|
400에서 419 사이의 숫자 또는42[0-5]
420에서 425 사이의 숫자
)-
그 뒤에 하이픈이 옵니다.
숫자가 아닌 요구사항을 제공하면 일치하지 않음을 의미합니다.ABC1234-Something
답변4
grep -E "(^[[:upper:]]{3}(3[0-9]{2}|4([0-1][0-9]|2[0-5]))|\b[[:upper:]]{3}(3[0-9]{2}|4([0-1][0-9]|2[0-5])))" sample.txt
grep -E
확장된 정규식을 사용합니다.
^[[:upper:]]{3}
: 줄이 세 개의 대문자 알파벳 문자로 시작하는 경우
3[0-9]{2}
: 300보다 크거나 같은 일련의 숫자와 일치합니다.
|
: 또는
4([0-1][0-9]|2[0-5])
: 400~425 사이.
|
: 또는 (여기서 두 번째 열 참조)
\b
: 세상에는 경계가 있다 (공간이 있다)
[[:upper:]]{3}(3[0-9]{2}|4([0-1][0-9]|2[0-5]))
: 첫 번째 경로와 동일합니다.