gpt4 book ai didi

linux - 使用 awk 打印两列之间具有重叠值范围的记录对

转载 作者:太空宇宙 更新时间:2023-11-04 09:24:11 25 4
gpt4 key购买 nike

我有不同的记录对应于开始($6)和停止($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分钟就完成了。

最佳答案

此解决方案需要 GNU awk:

{
start = $6 * 10 + 5;
stop = $7 * 10;
data[start] = data[start] " " $1;
data[stop] = data[stop] " " $1;
}
END {
PROCINFO["sorted_in"] = "@ind_num_asc";
for (d in data) {
count = split(data[d], fields);
for (i in fields) {
id = fields[i];
if (d % 10 == 5) { # start
for (s in started) {
print s, id;
}
started[id] = 1;
} else { # stop
delete started[id];
}
}
}
}

基本思想是这样的:将开始和结束标记(我称它们为索引,可能是一个错误的选择)放在一个数组中,然后按索引对该数组进行排序。然后,遍历数组。如果遇到“开始”标记,将其放入另一个数组(称为“开始”)。如果遇到“停止”标记,请将其从该数组中删除。现在,如果您遇到“开始”标记,则该间隔与数组“开始”中当前的所有间隔重叠,因此打印出匹配项。通过确保“停止”标记位于具有相同原始索引的“开始”标记之前,您可以消除极端情况。

关于linux - 使用 awk 打印两列之间具有重叠值范围的记录对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38482040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com