gpt4 book ai didi

linux - AWK:根据文件中给出的重叠范围合并两个文件

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

让我用一个虚拟示例来解释我的问题。这是文件 A -

1 10 20 aa
2 30 40 bb
3 60 70 cc
. .. .. ..

这是文件 B -

10 15 xx yy mm
21 29 mm nn ss
11 18 rr tt yy
69 90 qq ww ee
.. .. .. .. ..

我正在尝试合并这些文件 A 和 B,以便 A 行和 B 行之间存在一些重叠。

在我的例子中,A 行和 B 行之间重叠:A 行的从 $2 到 $3 的范围与 B 行的从 $1 到 $2 的范围之间存在一些共同点。在上面的示例中, range(10,20) 和 range(10,15) 之间存在重叠。这里 range(10,20) = [10,11,12,13,14,15,16,17,18,19] 和范围(10,15) = [10,11,12,13,14]

所以预期的输出是 -

1 10 20 aa 10 15 xx
1 10 20 aa 11 18 rr
3 60 70 cc 69 90 qq

我尝试了这种方式(使用和 awk):

    for peak in State.peaks:
i = peak[-1]
peak = peak[:-1]
a = peak[1]
b = peak[2]
d = State.delta
c = ''' awk '{id=%d;delta=%d;a=%d;b=%d;x=%s;y=%s;if((x<=a&&y>a)||(x<=b&&y>b) || (x>a&&y<=b)) print id" "$7" "$3-$2} ' %s > %s ''' % (i, d, a, b, "$2-d", "$3+d", State.fourD, "file"+str(name))
os.system(c)

想要完全删除 python 部分,因为它需要很多时间。

最佳答案

awk 来救援!

$ awk 'function intersect(x1,y1,x2,y2) 
{return (x1>=x2 && x1<y2) || (x2>=x1 && x2<y1)}

NR==FNR{lower[$0]=$2; upper[$0]=$3; next}

{for(k in lower)
if(intersect(lower[k],upper[k],$1,$2))
print k,$1,$2,$3}' file1 file2

请注意

(x1>=x2 && x1<y2) || (x2>=x1 && x2<y1) 
= [x1>=x2 || (x2>=x1 && x2<y1)] && [x1<y2 || (x2>=x1 && x2<y1)]
= [(x1>=x2 || x2>=x1) && (x1>=x2 || x2<y1) && [// symmetric 1~2]
= [True && x2 < max(x1,y1)] && [// symmetric 1~2]
= x2<y1 && y2<x1

这相当于 @Jonathan Leffler 的条件,它更紧凑、更高效,尽管乍一看并不微不足道。

关于linux - AWK:根据文件中给出的重叠范围合并两个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49338959/

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