Bash/Awk:使用重叠坐标查找两个文件中的常见易位

Lea*_*fou 0 bash awk overlap

我想比较两个文件以识别常见的易位。但是,这些易位在文件之间没有完全相同的坐标。所以我想看看易位是否发生在同一对染色体(chr1,chr2)之间,以及坐标是否重叠。

以下是两个文件的示例:

文件_1.txt:

chr1 min1 max1 chr2 min2 max2
1 111111 222222 2 333333 444444
2 777777 888888 3 555555 666666
15 10 100 15 2000 2100
17 500 530 18 700 750   
20 123456 234567 20 345678 456789
Run Code Online (Sandbox Code Playgroud)

file_2.txt:

chr1 min1 max1 chr2 min2 max2
1 100000 200000 2 400000 500000
2 800000 900000 3 500000 600000
15 200 300 15 2000 3000
20 150000 200000 20 300000 500000
Run Code Online (Sandbox Code Playgroud)

目标是文件 1 和文件 2 之间的 chr1 和 chr2 对相同。那么坐标 min1 和 max1 必须在两个文件之间重叠。min2 和 max2 相同。

对于结果,也许最好的解决方案是按如下方式打印两行:

1   111111  222222  2   333333  444444
1   100000  200000  2   400000  500000

2   777777  888888  3   555555  666666
2   800000  900000  3   500000  600000

20  123456  234567  20  345678  456789
20  150000  200000  20  300000  500000
Run Code Online (Sandbox Code Playgroud)

(对于这个简化的例子,我试图表示我可能遇到的不同类型的重叠。我希望它足够清楚)。

感谢您的帮助。

kar*_*kfa 5

awk 来救援!

$ awk 'function overlap(x1,y1,x2,y2) {return y1>x2 && y2>x1}
             {k=$1 FS $4}
     NR==FNR {r[k]=$0; c1min[k]=$2; c1max[k]=$3; c2min[k]=$5; c2max[k]=$6; next}
     overlap(c1min[k],c1max[k],$2,$3) &&
     overlap(c2min[k],c2max[k],$5,$6) {print r[k] ORS $0 ORS}' file1 file2

1 111111 222222 2 333333 444444
1 100000 200000 2 400000 500000

2 777777 888888 3 555555 666666
2 800000 900000 3 500000 600000

20 123456 234567 20 345678 456789
20 150000 200000 20 300000 500000
Run Code Online (Sandbox Code Playgroud)

假设第一个文件可以保存在内存中,并在末尾打印一个额外的空行。