Colunas de referência cruzada entre arquivos

2

Tenho certeza que deve haver uma maneira de fazer isso, mas estou preso, por isso adoraria sua ajuda. Eu tenho dois arquivos semelhantes:

Arquivo1:

8750    11.29592283
8800    7.500359335
14150   3.281781819
23850   3.668931975
23900   14.69918465
23950   5.259260427
27300   3.374571119

Arquivo2:

hypothetical protein CDS                7152            7346            TK0006
hypothetical protein CDS                7399            7614            TK0007
DNA methylase CDS               7655            8755            TK0008
hypothetical protein CDS                8760            10093           TK0009
hypothetical protein CDS                10095           10379           TK0010
hypothetical protein CDS                10385           10807           TK0011

Arquivo1 são coordenadas do genoma e valores de expressão; Arquivo2 é anotações do genoma. O que eu preciso é se o valor em column1 file1 estiver entre column2 file2 e column3 file3; retorne a linha completa de cada arquivo. Por exemplo, as primeiras duas linhas do arquivo1 retornariam uma saída de:

8750    11.29592283    DNA methylase CDS               7655            8755            TK0008
8800    7.500359335    hypothetical protein CDS                8760            10093           TK0009

Esse processo é possível com um comando awk curto ou similar? Ou estou mordendo mais do que posso mastigar?

Obrigado !!

    
por catchprj 26.06.2017 / 10:18

1 resposta

1
Solução

awk :

awk -F'[[:space:]][[:space:]]+' 'NR==FNR{ a[$1]=$0; next }
     {  for(i in a) { 
            if (int(i) >= $2 && int(i) <= $3) { 
                print a[i],$0; delete a[i]; break 
            } 
        }
     }' File1 OFS='\t' File2

A saída:

8750    11.29592283 DNA methylase CDS               7655            8755            TK0008
8800    7.500359335 hypothetical protein CDS                8760            10093           TK0009
  • -F'[[:space:]][[:space:]]+' - separador de campo de definição de padrões

  • a[$1]=$0 - capturando valores cruciais de File1

  • if (int(i) >= $2 && int(i) <= $3) - verifique se o valor de primeiro campo de File1 está no intervalo (entre os valores do segundo e terceiro níveis de File2 )

  • delete a[i] - elimina o valor correspondente

  • break - quebrando o loop para evitar iterações redundantes

por 26.06.2017 / 10:54

Tags