bash - Bash/Awk:使用重叠坐标在两个文件中查找常见易位
问题描述
我想将两个文件与已识别的常见易位进行比较。但是,这些易位文件之间的坐标并不完全相同。所以我想看看易位是否发生在同一对染色体(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
文件_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
目标是文件 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
(对于这个简化的例子,我试图表示我可能遇到的不同类型的重叠。我希望它足够清楚)。
谢谢您的帮助。
解决方案
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
假设第一个文件可以保存在内存中并在最后打印一个额外的空行。
推荐阅读
- mysql - Mysql 触发器创建语法错误
- ios - 将 alamofire 响应解析为 JSON 返回 nil
- javascript - for循环中的jquery hasClass不是函数
- css - 对齐 font-variant:smallcaps 与其他元素
- jquery - 从数据库中检索数据并使用 jquery 将数据加载到表中
- java - 项目构建错误:org.springframework.cloud:spring-cloud-starter-sleuth-zipkin:jar 的“dependencies.dependency.version”缺失
- python - 多处理和慢速文件系统
- reactjs - React - 为映射数组中的每个元素打开模态,无论单击哪个元素
- javascript - 添加搜索栏时 mat select 的默认行为发生变化
- magento - 如何安全地进行从 magento 到 shopify 的手动迁移?