Pesquisando arquivo com base no intervalo de dados

1

Postei anteriormente solicitando ajuda com contando as ocorrências de uma string . Agora estou esperando para procurar a ocorrência de uma seqüência de caracteres dentro de um intervalo de valores e imprimir um arquivo formatado de forma semelhante (os intervalos abaixo são classificados pelo número inicial no intervalo).

500506  genome  71445   71461   0
500506  genome  308369  308384  0
500506  genome  335450  335533  0
500506  genome  425268  425293  0
500506  genome  623326  623715  0
502289  genome  308370  308384  0
502289  genome  335462  335689  0
502289  genome  425268  425290  0

e eu quero obter uma lista mostrando o intervalo, o número de vezes que vejo esse intervalo no meu arquivo e qual dos identificadores de linha tem esse intervalo

71445-71461 1 500506
308369-308369 1 500506
308370-308384 2 500506,502289 
335450-335461 1 500506
335462-335533 2 500506,502289
335534-335689 2 500506,502289
425268-425290 2 500506,502289
425291-425293 1 500506

No exemplo acima, 502289 pode estar exatamente igual ao mesmo intervalo que 500506 ou pode estar em algum lugar dentro desse intervalo, ou vice-versa. Isso será possível com um script simples? Ou devo usar algo como um script perl?

    
por drea 20.01.2015 / 23:12

1 resposta

1

O script a seguir deve ser testado em um volume de dados muito maior (mais de 4 linhas) para verificar a execução correta desta declaração if ((A[1]<$3 && $4<=A[2])||(A[1]<=$3 && $4<A[2]))

awk '
    BEGIN{SUBSEP="-"}
    {     if (($3, $4) in ids)
              ids[$3,$4]=ids[$3,$4] "," $1
          else
              ids[$3,$4]=$1
    } 
    END{  for (rng1 in ids) {
              split (rng1,A,SUBSEP)
              for (rng2 in ids) {
                  split (rng2,B,SUBSEP)
                  if ((A[1]<B[1] && B[2]<=A[2])||(A[1]<=B[1] && B[2]<A[2]))
                      ids[rng2]=ids[rng2] "," ids[rng1]
                  }
              }
          for (rng in ids) {
              for (i=1;i<=split(ids[rng],D,",");i++)
                  a[D[i]]=1
              s=k=""
              n=0
              for (j in a) {
                  k=k s j
                  s=","
                  n++
                  }
              print rng, n, k
              delete a
              }
     }' formatted.file
    
por 21.01.2015 / 02:03