У меня есть постельная папка с генами на плюсовой и минусовой цепях.Я хочу получить межгенные области между генами на положительной и отрицательной цепях. Есть ли способ сделать это с помощью команды 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 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 -