确定AWK中的重叠范围

时间:2012-10-05 08:34:16

标签: file text awk comparison match

我有一个包含3列行的文件(制表符分隔),例如:

2 45 100

第二个文件,包含3列的行(制表符分隔),例如:

2 10 200

我想要一个匹配行的awk命令,如果两个文件中的$ 1匹配,并且文件1中$ 2 $ 3之间的范围与文件2中的$ 2- $ 3中的范围完全相同。它可以在值的范围内在文件2中或文件2中的范围可以在文件1的范围内,或者它可以只是部分重叠。范围之间的任何类型的交叉都将计为匹配,然后在文件3中打印该行。

我的当前代码仅匹配$ 1且$ 2或$ 3匹配,但是当范围在彼此之内时不起作用,因为在这些情况下精确数字不匹配。

  awk '
        BEGIN {
            FS = "\t";
        }
        FILENAME == ARGV[1] {
            pair[ $1, $2, $3 ] = 1;
            next;
        }
        {
            if ( pair[ $1, $2, $3 ] == 1 ) {
                print $1 $2 $3;
            }
        }

示例输入:

File1中:

1 10 23
2 30 50
6 100 110
8 20 25

文件2:

1 5 15
10 30 50
2 10 100
8 22 24

这里第1行(file1)与第1行(file2)匹配,因为第一列匹配AND范围两个范围之间的10-15重叠 第2行(file1)与第3行(file2)匹配,因为第一列匹配且范围30-50在10-100范围内。 第4行(file1)与第4行(file2)匹配,因为第一列匹配且范围22-24在两者中重叠。 因此输出将是在新输出文件中打印的file2中的第1,2和4行。

希望这些例子有所帮助。

非常感谢您的帮助。

提前谢谢!

1 个答案:

答案 0 :(得分:1)

如果使用join命令通过第一个字段($ 1)合并两个文件,则非常容易:

如果您只想将file2行作为输出:

join --nocheck-order <(sort -n file1) <(sort -n file2) | awk '{if ($2 >= $4 && $2 <= $5 || $3 >= $4 && $3 <= $5 || $4 >= $2 && $4 <= $3 || $5 >= $2 && $5 <= $3) {print $1" "$4" "$5;}}' -

使用输入文件我得到了这个输出:

1 5 15
2 10 100
8 22 24