用 awk 比较两个不同文件中的两个数值范围

Compare two numerical ranges in two distincts files with awk

我有一个包含 3 列的文件 1。第 2 列和第 3 列定义了一个数值范围。数据在第 2 列中从小到大排序。数值范围从不重叠。

file1(参考)

S   24     96
S   126    352
S   548    600
S   724    736

我有第二个文件 2(测试),结构类似。

文件 2(测试)

S   27     93
S   123    355
S   542    584
S   726    740
S   1014   2540
S   12652  12987

期望的输出:打印 file2 的行,其范围与 file1 的范围重叠(包括部分重叠)

产出

S   27     93     * partially overlap with L1 of file1
S   123    355    * partially overlap with L2 of file1
S   542    584    * partially overlap with L3 of file1
S   726    740    * partially overlap with L4 of file1

到目前为止我尝试了什么:

  1. 我试图将@EdMorton 提供的解决方案改编成类似的问题:Comparing two columns in two files using awk

    awk 'NR==FNR{a[,];next} (,) in a' file1 file2

这个问题和我的主要区别在于他们在两个文件中搜索完全相同的范围。在我的例子中,数字范围只能是部分的(只有一个位置)。使用此解决方案,我搜索更改表达式 (,) in a 以将 file2 的范围与存储在数组中的范围进行比较。没有任何成功。

  1. 我尝试了不在数组中存储数值范围而是单独存储数字(文件 1 的 a 中的第 2 列和 b 中的第 3 列)的方法,然后将文件 2 的第 2 列和第 3 列与存储在数组中的。

    awk 'NR==FNR {a[]=; b[]=; next} ( <= a[] && >= b[]) || ( >= a[] && <= b[]) || ( <= a[] && <= b[] && >= a[]) || ( >= a[] && <= b[] && >= b[])' file1 file 2

这种方法也没有正常工作。

  1. 最后,我还尝试了这样的 join 命令(见下文),希望我可以在连接的文件中执行比较。不幸的是,它也没有用。

    join file1 file2 | awk '{if ( <= && >= || >= && <= || <= && <= && <= || >= && <= && >= ) {print [=17=];}}' -

谢谢你能帮我解决我的问题。最好的,

$ cat tst.awk
NR == FNR {
    begs2ends[] = 
    next
}
{
    for (beg in begs2ends) {
        end = begs2ends[beg] + 0
        beg += 0
        if (    ( ( >= beg) && ( <= end) ) ||
                ( ( >= beg) && ( <= end) ) ||
                ( ( <= beg) && ( >= end) )  ) {
            print
            next
        }
    }
}

$ awk -f tst.awk file1 file2
S   27     93
S   123    355
S   542    584
S   726    740