조건별로 부분 중복 목록 필터링

조건별로 부분 중복 목록 필터링

부분적으로 중복된 기록 목록이 있습니다. 각 고유 레코드는 처음 5개 필드로 식별되지만 각 레코드에는 후속 4개 필드의 내용으로 정의되는 여러 "특성"이 연관되어 있습니다. 각 레코드의 첫 번째 필드에는 "식별자"가 있지만 식별자에는 이와 연결된 여러 레코드가 있을 수 있습니다. 예는 다음과 같습니다:

A   1   122114  A   T   ABCD    c.123A>T    41  K/Y
A   1   122114  A   T   EFGH    c.456-7890T>A   .   .
B   7   56715   G   C   IJKL    c.321+9876C>A   .   .
B   7   56715   G   C   MNOP    c.543G>C    181 Q/L
B   7   56715   G   C   PONM    c.-7324G>C  .   .
C   12  9844    T   C   QRST    c.8392-68723T>C .   .
C   12  3338745 T   C   UVWX    c.599A>G    200 P/*
C   21  71120   C   G   YZAB    c.35C>G 12  D
C   21  71120   C   G   CDEF    c.-2345G>C  .   .
D   1   122114  A   T   ABCD    c.123A>T    41  K/Y
D   1   122114  A   T   EFGH    c.456-7890T>A   .   .
E   8   5094    A   AT  GHIJ    c.678_679insT   226-227 .
E   8   5094    A   AT  KLMN    c.-2356_-2357insT   .   .

조건부 계층 구조를 사용하여 "기능"을 필터링하여 각 "레코드"에 대해 한 줄로 파일을 필터링하고 싶습니다. 예를 들면 다음과 같습니다.

  • 필드 9에는 "/"가 포함됩니다. 그렇지 않으면
  • 필드 9에는 [AZ]가 포함됩니다. 그렇지 않은 경우
  • 필드 8에는 [숫자]가 포함됩니다. 그렇지 않으면
  • 필드 7에는 "[범위 -50 ~ +50][A, C, T 또는 G]"가 포함됩니다.

"레코드"가 이러한 조건을 충족하면 더 이상 진행되지 않기를 바랍니다("레코드"당 하나 이상의 행을 가져오는 것을 방지하기 위해).

awk를 사용하여 처음 5개 필드가 있는 배열을 만들고 for 루프를 실행하려고 시도했지만 이에 대해 약간의 해싱을 수행했습니다(말장난 죄송합니다).

awk -F"\t" '{a[$1$2$3$4$5]=$0;{for (i in a) if ($9~"/") print a[i]; else if ($9~/[A-Z]/) print a[i]; else if ($8~/[0-9]/) print a[i]}}' file

결국 여러 번 인쇄됩니다. awk에서 이 작업을 수행할 수 있는 방법이 있나요?

답변1

Perl 코드 줄은 다음과 같습니다.

perl -F'\t' -lane '$r{$F[0].$F[1].$F[2].$F[3].$F[4]}=$_ if $F[8]=~/\// or $F[8]=~[A-Z] or $F[7]=~/\d/ or $F[6]=~/\b(\d\d)[ACTG]/ and $1<=50; END{print $r{$_} for (keys %r)}' file

논평:

perl시스템에서 사용할 수 있다고 가정하면 솔루션이 제공됩니다. awk논리와 구문이 매우 유사하므로 필요한 경우 쉽게 다시 작성할 수 있습니다 .

조건은 사양 및 awk스니펫을 기반으로 합니다. 주석에서 이미 지적했듯이 그 중 적어도 하나는 입력 파일 예제와 일치하지 않는 것 같습니다.

이것마지막동일한 키로 찾은 레코드를 인쇄합니다.

레코드는 무작위 순서로 인쇄됩니다.

관련 정보