특정 범위에 속하는 일부 값을 추출하는 방법

특정 범위에 속하는 일부 값을 추출하는 방법

아래와 같이 약 4500개의 아미노산 변형 행이 있습니다.

S1437T
H1266Y
T2662A
E1397A
E626K
S1538T
E3021K

간단히 말하면, 숫자 양쪽의 문자는 아미노산 잔기이고 숫자는 잔기 위치를 나타냅니다. 2400에서 3100 범위의 변경 사항만 검색하고 싶습니다.

나는 사용해 보았지만 grep성공하지 못했습니다. 또한 이런 종류의 작업에 더 나을 수 있다는 것을 알고 있지만 awk저는 이것에 대해 완전히 멍청합니다 awk. 어떤 도움이라도 대단히 감사하겠습니다.

답변1

perl첫 번째 숫자 시퀀스를 추출한 \d+후 해당 값을 확인합니다.

$ perl -ne 'print if /\d+/ && $& >= 2400 && $& <= 3100' < your-file
T2662A
E3021K

답변2

대문자를 구분 기호로 사용하면 awk두 번째 필드를 보고 행을 추출해야 하는지 결정할 수 있습니다.

$ awk -F '[[:upper:]]' '$2 >= 2400 && $2 <= 3100' file
T2662A
E3021K

실제로 숫자와 숫자가 아닌 숫자가 혼합된 필드를 숫자로 사용하면 필드가 숫자로 변환되고 숫자가 아닌 첫 번째 문자에서 중지되므로 줄의 첫 번째 문자를 구분 기호로 처리하면 충분합니다.

$ awk -F '^.' '$2 >= 2400 && $2 <= 3100' file
T2662A
E3021K

의 경우 sed도구가 산술 능력이 좋지 않기 때문에 약간 까다롭습니다. 다음 명령은 단지 흥미를 끌기 위해 포함되었습니다.

여기서는 입력 데이터의 각 줄에 대해 세 개의 정규식을 일치시키고 일치하면 줄을 인쇄합니다. 첫 번째 표현식은 2400-2999 범위를 처리하고 두 번째 표현식은 3000-3099 범위를 처리합니다. 세 번째 표현식으로 3100만 테스트합니다. 각 테스트에서는 숫자 양쪽에 대문자가 표시되도록 요구했습니다.

$ sed -n \
    -e '/^[[:upper:]]2[4-9][0-9][0-9][[:upper:]]$/p' \
    -e '/^[[:upper:]]30[0-9][0-9][[:upper:]]$/p' \
    -e '/^[[:upper:]]3100[[:upper:]]$/p' file
T2662A
E3021K

테스트를 보다 효율적으로 수행하기 위해 약간 더 긴 편집 스크립트:

$ sed \
    -e '/^[[:upper:]]2[4-9][0-9][0-9][[:upper:]]$/b' \
    -e '/^[[:upper:]]30[0-9][0-9][[:upper:]]$/b' \
    -e '/^[[:upper:]]3100[[:upper:]]$/b' \
    -e d file
T2662A
E3021K

인수가 없는 명령은 b스크립트를 끝으로 분기하며 암시적 인쇄 작업이 현재 줄을 출력합니다. d일치하는 항목이 없는 줄에 대해 최종 명령을 실행합니다. 이렇게 하면 일치하는 행이 너무 많이 테스트되지 않습니다.

답변3

awk현재 줄( )에서 앞뒤 문자를 제거합니다 r.

awk '{r=$0; gsub(/^[A-Z]/,"",r); gsub(/[A-Z]$/,"",r)} r>=2400 && r<=3100' file

산출:

T2662A
E3021K

답변4

Python에는 의도로 긴밀하게 변환되는 연쇄 비교 기능이 있습니다.

python3 <<\eof
with open('file') as f:
  for l in f:
    n = int(l[1:-2])
    if 2400 <= n <= 3100:
      print(l,end="")
eof
T2662A
E3021K

범위 객체를 생성하고 비교하여 체인 비교를 다음으로 대체할 수도 있습니다.

if n in range(2400,3100+1):

Perl의 grep 명령을 사용하여 숫자가 존재하는지 검색할 수 있습니다.

perl -lne 'my $n = s/\D//gr;
  print if grep(/^$n$/,2400..3100);
' file

여기서는 GNU sed를 사용하여 GNU dc 명령에 대한 데이터를 전처리한 다음 제품 (num-lowerlim)x(upperlim-num) >= 0을 비교하여 범위 멤버십을 확인하여 인쇄 자격을 확인합니다.

sed -Ee '
  h;s/.(.*)./\1/
  x;s/.*/[&]/;G;
  s/\n/ /
' file |
dc -e "
[q]sq [p]sp
[2400-r3100r-*0!>p]su
[?z0=q dlux c z0=?]s?
l?x
"

이 방법에서는 먼저 두 번째 열부터 숫자를 정렬합니다.

sort -k1.2n file |
awk '{n=0+substr($0,2)}
n < 2400 {next}
n > 3100 {exit}
1'

관련 정보