아래와 같이 약 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'