如何将一个文件中的值与另一个文件中的值匹配?

Bor*_*din -26 perl awk

有两个输入文件,如下面的行所示.

列3和4 input1保持一个范围(例如,178第一行中)

第2列input2保持单个位置值(例如32在第一行中),其对应于列中的一个范围input1,以及第2 列中的对应值:在这种情况下B100002.

我想为文件的第2列中的每个值生成一个文件,其中包含相对于范围起点的位置 input1

例如,358-344 + 1 = 15是相对位置值 B100043

输入1:

Scaffold_1      B100002        1       78
Scaffold_1      B100041        179     243
Scaffold_1      B100043        344     418
Scaffold_1      B100045        519     583
Scaffold_1      B100058        684     751
Scaffold_1      B100059        852     915
Scaffold_1      B100066        1016    1079
Scaffold_1      B100080        1180    1246
Scaffold_1      B100111        1347    1413
Scaffold_1      B100118        1514    1585
Scaffold_2      B123465        31531   31595
Run Code Online (Sandbox Code Playgroud)

输入2:

Scaffold_1      32
Scaffold_1      358
Scaffold_2      31533
Run Code Online (Sandbox Code Playgroud)

所需输出:

B100002      32
B100043      15
B123465      2
Run Code Online (Sandbox Code Playgroud)

这是我的解决方案

  1. 将格式更改input1input_1input2更改input_2(制表符分隔)

  2. 使用软件bedtools和awk生成我想要的输出文件.

INPUT_1:

Scaffold_1      .       B100002        1       78      .      .       .       .
Scaffold_1      .       B100041        179     243     .      .       .       .
Scaffold_1      .       B100043        344     418     .      .       .       .
Scaffold_1      .       B100045        519     583     .      .       .       .
Scaffold_1      .       B100058        684     751     .      .       .       .
Scaffold_1      .       B100059        852     915     .      .       .       .
Scaffold_1      .       B100066        1016    1079    .      .       .       .
Scaffold_1      .       B100080        1180    1246    .      .       .       .
Scaffold_1      .       B100111        1347    1413    .      .       .       .
Scaffold_1      .       B100118        1514    1585    .      .       .       .
Scaffold_1      .       B101068        9218    9290    .      .       .       .
Scaffold_2      .       B123465        31531   31595   .      .       .       .

input_2:
Scaffold_1      .       .      31         33       .       .       .       .
Scaffold_1      .       .      357        359      .       .       .       .
Scaffold_2      .       .      31532      31534    .       .       .       .


bedtools intersect -wb -a test2 -b test1 | awk '{print $12,($5-$13)}'
B100002 32
B100043 15
B123465 3
Run Code Online (Sandbox Code Playgroud)

我如何使用awkperl实现我的目的?(当我使用bedtools时,我必须更改文件格式.)

kar*_*kfa 6

如果数据文件大小不大,则有一种更简单的方法

$ join input1 input2 | awk '$5<$4 && $3<$5 {print $2, $5-$3+1}'

B100002 32
B100043 15
B123465 3
Run Code Online (Sandbox Code Playgroud)