awk для добавления текста в файл на основе координат - PullRequest
0 голосов
/ 16 января 2019

В приведенном ниже awk (который выполняется, но выдает пустой вывод) я использую $4 in file1 в качестве уникального идентификатора и считываю каждое значение $1, $2 и $3 в переменная chr, min и max.

Затем $4 делится на _ в file2 и считывается в array. Каждое значение в разбиении будет соответствовать $4 id в file1. chr должно соответствовать $1, min и max должны находиться между значениями $2 и $3 в file2.

Точное совпадение не требуется, просто переменные min или max находятся в пределах $2 и $3. Если это правда, тогда exon печатается в $5 из file1, если это не так, тогда intron печатается в $5.

К желаемому выводу добавлен exon/intron, но есть другая часть, в которой значения в $2 или $3 настраиваются, но я пытаюсь написать сценарий, прежде чем спрашивать. Я не уверен, что приведенное ниже - лучший способ, но, надеюсь, это начало. Спасибо:).

file1 tab delimited за исключением пробелов после $3 и $4

chr7    94027591    94027701    COL1A2
chr6    31980068    31980074    TNXB

file2 tab delimited

chr7    94027059    94027070    COL1A2_cds_1_0_chr7_94027060_f  0   +
chr7    94027693    94027708    COL1A2_cds_2_0_chr7_94027694_f  0   +
chr6    32009125    32009227    TNXB_cds_0_0_chr6_32009126_r    0   -
chr6    32009547    32009711    TNXB_cds_1_0_chr6_32009548_r    0   -

желаемый выход

chr7    94027683    94027701    COL1A2    exon
chr6    31980068    31980074    TNXB    intron

awk с комментариями

awk '
FNR==NR{ open block process matching line in file 1 and file2
 a[$4];  # use as a key with unique id
 chr[$4]=$1;  # store $1 value in chr
 min[$4]=$2;  # store $2 value in min
 max[$4]=$3;  # store $3 value in max
  next  # process next line
}  # close block
{  # open block
 split($4,array,"_");  # spilt $4 on underscore
 print $0,(array[1] in a) &&  ($2<=min[array[1]] && $2<=max[array[1] &&  $1=chr[array[1]])?"exon":"intron"
}' file1 OFS="\t" file2 > output  # close block, mention input with field separators and output

1 Ответ

0 голосов
/ 16 января 2019

ИМХО, ваш показанный конечный результат НЕ выглядит правильным по логике, так как Input_file2 имеет несколько записей, а Input_file1 имеет только одиночные (я собираюсь только на показанных примерах). Не могли бы вы проверить это один раз? Если какие-либо изменения в вашем выводе или логике, то, пожалуйста, упомяните их четко.

awk '
BEGIN{
  SUBSEP=","
}
FNR==NR{
  max[$1,$NF]=$3
  min[$1,$NF]=$2
  next
}
{
  split($4,array,"_")
}
(($1,array[1]) in max){
  if(($2>min[array[5],array[1]] && $2<max[array[5],array[1]]) || ($3>max[array[5],array[1]] && $3<max[array[5],array[1]])){
     print array[5],array[1],min[array[5],array[1]],max[array[5],array[1]],"exon"
     next
  }
}
{
  print $0,"intron"
}'  Input_file1   Input_file2  | column -t

Что эта команда делает, это проверяет 2-е поле Input_file2 ИЛИ 3-е поле, либо они находятся в диапазоне 2-го и 3-го поля Input_file1. Если кто-то из них приходит, я печатаю вывод Input_file1, добавляя в него exon, или же выводя вывод Input_file2, добавляя intron строку в конце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...