Файл поиска awk может содержать несколько записей id - PullRequest
0 голосов
/ 17 января 2019

awk ниже работает отлично, благодаря @ RavinderSingh13, если идентификатор в $4 (как в f) уникален. Однако большая часть моих данных похожа на f1, где один и тот же идентификатор может появляться несколько раз. Я думаю, что это причина, почему awk не работает, как ожидалось. Я добавил комментарий в строку, которую я не могу изменить, не вызывая сценарий прерывания. Каждая строка в f2 ищется и должна содержать идентификатор, в данном случае COL1A2, но этот идентификатор не может быть отдельной записью. То есть идентификатор может появляться 5 раз, но каждая строка с этим в f2 ищется. Используя $4 in f1 в качестве идентификатора и читая каждое значение $1, $2 и $3 в переменную min и max.

Затем $4 делится на _ в f2 и считывается в array. Один и тот же идентификатор из f1 может появляться в нескольких строках f2, однако каждая из них будет иметь уникальные значения $2 и $3. Каждое значение в разбиении будет соответствовать $4 id в f1. min и max должны соответствовать $1 из f2 и находиться между значениями $2 и $3 в f2. Точное совпадение не требуется, скорее просто переменные min или max находятся в пределах $2 и $3. Если это правда, то exon печатается в $5 из f2, если это не так, тогда intron печатается в $5. Большая часть этого работает, как и ожидалось, я просто не учел возможность нескольких приемов, и я не знаю, как это сделать. Спасибо:)

Например, используя содержимое f1, где COL1A2 появляется 3 раза, каждая запись или строка ищется в f2. В настоящее время, я считаю, что COL1A2 не является уникальным, в f2 не найдено совпадений, так как min и max не установлены для каждой записи или строки. Спасибо:).

awk с желаемым выходом

awk '
 BEGIN{
  SUBSEP=","
}
FNR==NR{
  max[$1,$NF]=$3
  min[$1,$NF]=$2
  next
}
{
 split($4,array,"_")   # How do I change/modify this so it only looks a each line with this id `COL1A2` in it?
}
(($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"}' f f2 

chr7    94024333    94024423    COL1A2_cds_0_0_chr7_94024344_f  0   + intron
chr7    94027049    94027080    COL1A2_cds_1_0_chr7_94027060_f  0   + intron
chr7 COL1A2 94027591 94027701 exon

awk с токовым выходом

  .... }' f1 f2

chr7    94024333    94024423    COL1A2_cds_0_0_chr7_94024344_f  0   + intron
chr7    94027049    94027080    COL1A2_cds_1_0_chr7_94027060_f  0   + intron
chr7    94027683    94027718    COL1A2_cds_2_0_chr7_94027694_f  0   + intron

содержимое f single COL1A2 entry

chr7    94027591    94027701    COL1A2

содержимое f1 multiple COL1A2 entry, this is most of the actual data, very few are single entries though there are some

chr7    94027591    94027701    COL1A2  
chr7    94027799    94027811    COL1A2  
chr7    94030799    94030847    COL1A2

содержимое f2 always the same format

chr7    94024333    94024423    COL1A2_cds_0_0_chr7_94024344_f  0   +
chr7    94027049    94027080    COL1A2_cds_1_0_chr7_94027060_f  0   +
chr7    94027683    94027718    COL1A2_cds_2_0_chr7_94027694_f  0   +
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...