Межгенные области? [closed]

У меня есть постельная папка с генами на плюсовой и минусовой цепях.Я хочу получить межгенные области между генами на положительной и отрицательной цепях. Есть ли способ сделать это с помощью команды awk? Огромное спасибо!

Изменить: второй и третий столбцы - это сайты запуска и остановки генов. В основном я хочу вычесть число в третьем столбце и число в предыдущей второй строке, если есть знак +, начинающийся снизу. Если в последнем столбце есть знак -, я также хочу начать снизу, но вычтите число во втором столбце и число в предыдущей третьей строке.

Требуемый выход

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

Вход

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 +
1
задан 2 November 2016 в 17:56

1 ответ

Я все еще не понимаю, что Ваше объяснение и желаемый произвело полностью (почему некоторые значения столбца 1 chr1 и некоторые ch1? почему столбец 2 в первой строке 820983, а не 860759?), однако этого может быть достаточно для запущения Вас.

Если бы Вы не заботитесь о порядке вывода, самая простая вещь, казалось бы, была бы для инвертирования порядка строк в файле, затем просто ведут прокручивающийся учет новых значений столбца 2 для + и - записи, и печатают/вычитают их когда следующее + или - встречен:

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

Если Вы действительно заботитесь о выходном порядке, то можно создать пару массивов plus и minus скажите, затем выполните итерации по ним в обратном поиске для следующего соответствия + или -. Это является слишком большим для остроты так представленной здесь как исполняемый файл awk сценарий:

$ 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);
  }
}

затем

$ ./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 -
1
ответ дан 7 December 2019 в 15:45

Другие вопросы по тегам:

Похожие вопросы: