부분적으로 중복된 기록 목록이 있습니다. 각 고유 레코드는 처음 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
스니펫을 기반으로 합니다. 주석에서 이미 지적했듯이 그 중 적어도 하나는 입력 파일 예제와 일치하지 않는 것 같습니다.
이것마지막동일한 키로 찾은 레코드를 인쇄합니다.
레코드는 무작위 순서로 인쇄됩니다.