Regiões Intergênicas? [fechadas]

1

Eu tenho um arquivo de cama com genes nas cadeias de mais e menos. Eu quero obter as regiões intergênicas entre os genes nas cadeias positivas e negativas. Existe alguma maneira de fazer isso com um comando awk? Muito obrigado!

Edit: A segunda e terceira colunas são sites de início e parada de genes. Basicamente, quero subtrair o número na terceira coluna e o número na segunda linha anterior, se houver um sinal de + começando na parte inferior. Se a última coluna tiver um sinal - eu também quero começar de baixo, mas subtraia o número na segunda coluna e o número na terceira linha anterior.

Saída desejada

chr1  820983    (860759-820983)    ENSG00000269308 591    +
chr1   818542     (818542-369634)   ENSG00000235249 587   +
ch1 738637     (738637-623056)      ENSG00000185097 589   -
ch1 621546     (621546-140379)      ENSG00000237683  586 -

Entrada

chr1    13885   140379  ENSG00000237683 586 -
chr1    36854   369634  ENSG00000235249 587 +    
chr1    621546  623056  ENSG00000185097 589 -    
chr1    738637  740137  ENSG00000269831 590 -    
chr1    818542  820983  ENSG00000269308 591 +   
chr1    860759  875671  ENSG00000187634 591 +
    
por lmcl 02.11.2016 / 14:37

1 resposta

1

Eu ainda não entendi completamente sua explicação e saída desejada (por que alguns valores da coluna 1 chr1 e alguns ch1 ? por que a coluna 2 na primeira linha 820983 ao invés de 860759?), no entanto isso pode ser o suficiente para você começar.

Se você não se importa com a ordem de saída, a coisa mais simples parece ser inverter a ordem das linhas no arquivo, e então simplesmente manter um registro contínuo dos valores mais recentes da coluna 2 para o + e - entradas, e imprima / subtraia-as quando o próximo + ou - for encontrado:

$ tac file.bed | awk '
>   $NF ~ /+/ {if(last2p) print $1, last2p, "(" last2p "-" $3 ")", $4, $5, $6; last2p = $2}
>   $NF ~ /-/ {if(last2m) print $1, last2m, "(" last2m "-" $3 ")", $4, $5, $6; last2m = $2}
> '
chr1 860759 (860759-820983) ENSG00000269308 591 +
chr1 738637 (738637-623056) ENSG00000185097 589 -
chr1 818542 (818542-369634) ENSG00000235249 587 +
chr1 621546 (621546-140379) ENSG00000237683 586 -

Se você fizer se preocupar com a ordem de saída, então você pode construir um par de arrays plus e minus , depois iterar sobre eles na ordem inversa procurando "up" para a próxima correspondência + ou - . Isso é muito grande para um one-liner, apresentado aqui como um script awk executável:

$ cat chr.awk
#!/usr/bin/gawk -f

function fooprint(a,i, j,p,q) {
  split(a[i], p);
  for(j=i-1;j>0;j--) {
    if(j in a) {
      split(a[j], q);
      print q[1], p[2], "(" p[2] "-" q[3] ")", q[4], q[5], q[6];
      break;
    }
  }
}

$NF ~ /+/ {plus[FNR] = $0}
$NF ~ /-/ {minus[FNR] = $0}

END {
  for(i=NR; i>1; i--) {
    if (i in plus)
      fooprint(plus,i);
    else if (i in minus)
      fooprint(minus,i);
  }
}

então

$ ./chr.awk file.bed
chr1 860759 (860759-820983) ENSG00000269308 591 +
chr1 818542 (818542-369634) ENSG00000235249 587 +
chr1 738637 (738637-623056) ENSG00000185097 589 -
chr1 621546 (621546-140379) ENSG00000237683 586 -
    
por steeldriver 03.11.2016 / 02:39