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

标签 linux shell unix awk overlapping

让我用一个虚拟示例来解释我的问题。 这是文件 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/

相关文章:

linux - 有人可以向初学者提供有关 Hadoop 工作原理的高级、简单的解释吗?

python - systemd 服务无法启动 bash 脚本

mysql - 在 bash 中从 mysql 读取多行时出错

php - 在 Mac OS X 中终止 PHP 进程

linux - 如何在不支持 ypchsh 的远程计算机中更改 Linux shell

linux - 使用 lsof 的脚本在 shell 上运行良好,而不是在 cron 上运行良好

linux - AWK 根据另一个文件的列过滤一个文件

linux - 如何在 gulp 中获取当前文件夹名称?

python - 如何安装python开发者包?

Linux - sh 脚本 - 从 FTP 下载多个文件