awk для вычисления разницы между двумя файлами и вывода конкретного текста на основе значения - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь использовать awk, чтобы проверить, попадает ли каждое $2 в file1 между $2 и $3 соответствующей строки $4 file2.Если это так, то в $5 из file2, экзон, если не интрон.Я думаю, что awk ниже сделает это, но я изо всех сил пытаюсь добавить вычисление, которое, если разница меньше или равна 10, тогда $5 склеивается.Я также добавил пример строки 1.

6-я строка является примером объединения, поскольку значение $2 в файле file1 * 2 отличается от значения $2 в file2.Мои фактические данные очень велики: file2 всегда составляет несколько сотен тысяч строк.Файл 1 будет переменным, но обычно ~ 100 строк.Файлы жестко закодированы в этом примере, но будут получены из цикла bash for.Это обеспечит ввод.Спасибо:).

file1 tab-delimited с пробелами после $ 3 и $ 4

chr1    17345304    17345315    SDHB    
chr1    17345516    17345524    SDHB    
chr1    93306242    93306261    RPL5    
chr1    93307262    93307291    RPL5
chrX    153295819   153296875   MECP2   
chrX    153295810   153296830   MECP2

file2 tab-delimited

chr1    17345375    17345453    SDHB_cds_0_0_chr1_17345376_r    0   -
chr1    17349102    17349225    SDHB_cds_1_0_chr1_17349103_r    0   -
chr1    17350467    17350569    SDHB_cds_2_0_chr1_17350468_r    0   -
chr1    17354243    17354360    SDHB_cds_3_0_chr1_17354244_r    0   -
chr1    17355094    17355231    SDHB_cds_4_0_chr1_17355095_r    0   -
chr1    17359554    17359640    SDHB_cds_5_0_chr1_17359555_r    0   -
chr1    17371255    17371383    SDHB_cds_6_0_chr1_17371256_r    0   -
chr1    17380442    17380514    SDHB_cds_7_0_chr1_17380443_r    0   -
chr1    93297671    93297674    RPL5_cds_0_0_chr1_93297672_f    0   +
chr1    93298945    93299015    RPL5_cds_1_0_chr1_93298946_f    0   +
chr1    93299101    93299217    RPL5_cds_2_0_chr1_93299102_f    0   +
chr1    93300335    93300470    RPL5_cds_3_0_chr1_93300336_f    0   +
chr1    93301746    93301949    RPL5_cds_4_0_chr1_93301747_f    0   +
chr1    93303012    93303190    RPL5_cds_5_0_chr1_93303013_f    0   +
chr1    93306107    93306196    RPL5_cds_6_0_chr1_93306108_f    0   +
chr1    93307322    93307422    RPL5_cds_7_0_chr1_93307323_f    0   +
chrX    153295817   153296901   MECP2_cds_0_0_chrX_153295818_r  0   -
chrX    153297657   153298008   MECP2_cds_1_0_chrX_153297658_r  0   -
chrX    153357641   153357667   MECP2_cds_2_0_chrX_153357642_r  0   -

желаемый выход tab-delimited

chr1    17345304    17345315    SDHB    intron
chr1    17345516    17345524    SDHB    intron  
chr1    93306242    93306261    RPL5    intron  
chr1    93307262    93307291    RPL5    intron
chrX    153295819   153296875   MECP2   exon
chrX    153295810   153296800   MECP2   splicing

awk

awk '
    FNR==NR{
     a[$4];
     min[$4]=$2;
     max[$4]=$3;
next
}
{
 split($4,array,"_");
 print $0,(array[1] in a) && ($2>=min[array[1]] && 
 $2<=max[array[1]])?"exon":"intron"
 }' file1 OFS="\t" file2 > output

пример строки 1

a[$4] = SDHB
min[$4] = 17345304
max[$4] = 17345315

array[1] = SDHB, 17345304 >= 17345375 && array[1] = SDHB, 17345315 <= 17345453 ---- intron
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...