awk计算两个文件之间的差异并基于值输出特定文本

时间:2018-12-18 19:10:07

标签: awk

我正在尝试使用awk检查$2中的每个file1是否位于匹配的$2行的$3$4之间file2中的。如果是,则在$5的{​​{1}}中,如果不是内含子,则为外显子。我认为下面的file2会做到这一点,但我正在努力尝试添加一个计算,如果差异小于或等于awk,则10就是拼接。我还添加了第1行的示例。

第六行是拼接的示例,因为file1中的$5值与$2中的2值相距$2。我的实际数据非常多,file2总是数十万行。文件1将是可变的,但通常为100行。在此示例中,文件是硬编码的,但是将从file2循环中获取。这将提供输入。谢谢:)。

file1 bash for,在$ 3和$ 4之后带有空格

tab-delimited

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

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

awk

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

第1行的示例

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

0 个答案:

没有答案