lista de filtros de duplicados parciais por condição (s)

1

Eu tenho uma lista de registros duplicados parciais. Cada registro único é identificado por seus primeiros 5 campos, no entanto, cada registro possui mais de um "recurso" associado a ele, definido pelo conteúdo dos 4 campos subseqüentes. Existe um "identificador" no primeiro campo de cada registro, mas um identificador pode ter mais de um registro associado a ele. Exemplo da seguinte forma:

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   .   .

Desejo filtrar o arquivo em uma linha para cada "registro", usando uma hierarquia de condições para filtrar os "recursos", por exemplo:

  • o campo 9 contém "/" ou
  • O campo 9 contém [A-Z] ou
  • O campo 8 contém [dígito] ou
  • O campo 7 contém "[intervalo de -50 a +50] [A, C, T ou G]"

Quando um "registro" atende a essas condições, não desejo mais (para evitar mais de uma linha por "registro").

Eu tentei usar o awk para criar uma matriz usando os primeiros 5 campos e executando um loop for, mas estou fazendo um pouco de hash (desculpe o trocadilho):

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

Isso acaba imprimindo duplicatas várias vezes. Existe uma maneira de fazer isso no awk?

    
por Pete C 16.03.2018 / 11:26

1 resposta

0

Perl one-liner aqui:

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

Comentários:

Uma solução perl foi oferecida supondo que esteja disponível em seu sistema. Se necessário, deve ser fácil reescrever em awk , dado que a lógica e a sintaxe são muito semelhantes.

As condições são baseadas nas suas especificações e awk snippet. Como já foi mencionado nos comentários, pelo menos um deles não parece aderente à sua amostra de arquivo de entrada.

O último registro encontrado com a mesma chave é impresso.

Os registros são impressos em ordem aleatória.

    
por 18.04.2018 / 16:33