В приведенном ниже 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