有两个输入文件,如下面的行所示.
列3和4 input1保持一个范围(例如,1到78第一行中)
第2列input2保持单个位置值(例如32在第一行中),其对应于列中的一个范围input1,以及第2 列中的对应值:在这种情况下B100002.
我想为文件的第2列中的每个值生成一个文件,其中包含相对于范围起点的位置 input1
例如,358-344 + 1 = 15是相对位置值 B100043
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)
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)
将格式更改input1为input_1和input2更改input_2(制表符分隔)
使用软件bedtools和awk生成我想要的输出文件.
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)
我如何使用awk或perl实现我的目的?(当我使用bedtools时,我必须更改文件格式.)
如果数据文件大小不大,则有一种更简单的方法
$ 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)