1

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

2 45 100

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

2 10 200

如果两个文件中的 $1 匹配并且文件 1 中的 $2-$3 之间的范围与文件 2 中的 $2-$3 的范围完全相交,我想要一个匹配行的 awk 命令。它可以在文件 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;
            }
        }

示例输入:

文件1:

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

希望这些例子有所帮助。

非常感谢您的帮助。

先感谢您!

4

1 回答 1

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
于 2012-10-05T09:27:03.767 回答