【发布时间】:2016-07-20 13:00:35
【问题描述】:
我有不同的记录对应于 start($6) 和 stop($7) 的范围。 我想要做的是打印出所有具有重叠范围的记录对。
例如,我的数据如下:
id1 0 376 . scaffold1 5165761 5166916
id2 0 366 . scaffold1 2297244 2298403
id3 155 456 . scaffold1 692777 693770
id4 185 403 . scaffold1 102245 729675
我想要的是这样的结果
id3 id4
因为 id4 的范围与 id3 重叠。 我一直在互联网上搜索解决方案,但似乎没有什么可以解决我的问题。
如果有人能给我一些建议,我将不胜感激。
在听取了以下回复中一些人的建议后,我确实尝试了这个确实有效的代码!
awk '{start[$1]=$6;stop[$1]=$7;} END {for(i in start) {for(j in stop) {if(start[i] >= start[j] && start[i] <= stop[j]) print i,j}}}' file | awk '{if($1!=$2) print}' -
处理时间很短...对于一个有 1400 条记录的文件,甚至不到 1 分钟就完成了。
【问题讨论】:
-
祝你好运。
-
What have you tried so far? 请edit 您的问题显示您遇到问题的代码的minimal reproducible example,然后我们可以尝试帮助解决具体问题。您还应该阅读How to Ask。
-
暴力破解其实很简单。将开始和停止数据读入由
id列索引的关联数组,然后检查所有可能的ID 对。只需谷歌重叠间隔或类似的东西。 -
@MichaelVehrs:是的,但如果数量或记录很大,处理时间(和内存)可能会爆炸。该文件包含多少条记录?
-
@CasimiretHippolyte 大约 1500 条记录...