Extrai as coordenadas Start e End de acordo com um comprimento definido de intervalo não fixo [closed]

1

Eu tenho um arquivo com intervalos começando na coluna "start" e terminando na coluna "end". Eu tenho que extrair o início e o fim desses intervalos de acordo com um comprimento definido que está escrito na quarta coluna. Também tenho que imprimir as informações presentes na coluna "score". O arquivo é assim:

Input:  
chr     start   end     score  length  
chr1    237592  237601  176    320
chr1    237601  237912  176    320
chr1    521409  521601  150    320  
chr1    521601  521729  150    320
chr1    714026  714346  83     320 
chr1    805100  805201  323    340
chr1    805201  805440  323    340


Output:
chr     start   end     score  length  
chr1    237592  237912  176    320
chr1    521409  521729  150    320 
chr1    714026  714346  83     320
chr1    805100  805440  323    340 

Conforme você percebe, a duração do intervalo a ser extraído está na quinta coluna. Como por exemplo o comprimento do intervalo na saída:

chr1    237592  237912

foi obtido subtraindo 237912 (na segunda linha da coluna "end") para 237592 (na primeira linha da coluna "start") que é 320 (como definido na quinta coluna).

Qualquer ideia é muito apreciada.

    
por fusion.slope 26.01.2017 / 19:58

2 respostas

2

O problema é mesclar linhas, falando livremente. Uma linha pode ser "mesclada" com a linha anterior se sua coordenada de início for igual à coordenada final da linha acima.

As linhas provavelmente correspondem aos recursos genômicos. E o objetivo é mesclar as características que são adjacentes na sequência genômica.

Este é um script awk que faz isso:

$2 == end {
    # This line merges with the previous line.
    # Update end and continue with next line.

    end = $3;
    next;
}

{
    # This is an unmergeable line (start doesn't correspond to end on
    # previous line).

    # If we've processed at least the header line, print the data collected.
    # The if statement avoids printing an empty output line at the 
    # start of the output.

    if (NR > 1) {
        print chr, start, end, score, len;
    }

    # Get data from this line.

    chr = $1;
    start = $2;
    end = $3;
    score = $4;
    len = $5;
}

END {
    # At the end of input, print the data as above to output last line.
    print chr, start, end, score, len;
}

O script pressupõe entrada classificada e que todas as coordenadas iniciais são estritamente menores que as coordenadas finais (isto é, que todos os recursos estão na cadeia positiva).

Teste:

$ awk -f script.awk data
chr start end score length
chr1 237592 237912 176 320
chr1 521409 521729 150 320
chr1 714026 714346 83 320
chr1 805100 805440 323 340
    
por 26.01.2017 / 23:28
0

Para mim, isso parece um arquivo de texto no qual as colunas são delimitadas por espaço em branco. Ele poderia ser elegantemente processado com R , mas o shell script também poderia fazer isso. O que você precisa é ler o arquivo linha por linha usando for loop. Dentro do loop, uma maneira simples seria atribuir cada valor de coluna (você poderia usar cut para isso) a uma variável e então imprimir as variáveis na ordem desejada. As variáveis da segunda e quinta coluna somadas produzem a terceira coluna para sua saída. Você pode imprimir na tela cada uma das suas linhas de saída com echo do loop for. Quando você vê as linhas imprimindo na tela ao seu gosto, você simplesmente redireciona a saída do seu script para um arquivo como esse your_script.sh > your new output.txt

    
por 26.01.2017 / 22:03