숫자의 범위를 찾기 위한 Grep

숫자의 범위를 찾기 위한 Grep

아미노산 및 잔류 데이터를 제공하는 여러 줄이 포함된 .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에서 시작하는 트리 문자를 추출하고 이를 r1sum 이라고 부릅니다 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])): 첫 번째 경로와 동일합니다.

관련 정보