File 识别AWK中的重叠范围

File 识别AWK中的重叠范围,file,text,awk,comparison,match,File,Text,Awk,Comparison,Match,我有一个文件,有3行3列(制表符分隔),例如: 第二个文件有3列行(制表符分隔),例如: 如果两个文件中的$1都匹配,并且文件1中的$2到$3的范围与文件2中的$2到$3的范围完全不匹配,那么我需要一个与行匹配的awk命令。它可以在文件2中的值范围内,或者文件2中的范围可以在文件1中的范围内,或者只是部分重叠。范围之间的任何类型的相交都将被视为匹配,然后在文件3中打印该行 我当前的代码仅在$1和$2或$3匹配时匹配,但在这些情况下,精确的数字不匹配,因此不适用于范围在彼此范围内的情况 awk

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

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

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

希望这些例子能有所帮助

非常感谢你的帮助


提前谢谢你

如果您使用
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;}}' -

如果您使用
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;}}' -


我以前试过帮你解决这个问题()。我建议您提供一个输入和预期输出的示例。否则,您将迫使我们猜测并构建我们自己的测试,而这些测试将不会像您提供给我们的那样准确。对于那些希望帮助你的人来说,这是时间和精力的损失。谢谢,我不知道你已经更新了答案来处理重叠范围的问题。我看一下,如果行得通,我就结束这个问题。我按照上面的要求添加了示例。否。我没有更新它。但是另一个线程更复杂,因为您要求遍历一个文件夹以查找文件并处理其中的每一个文件。我必须用我自己的(猜测的)数据创建所有这些文件,而且比第一眼看到的要多得多。我得到了,但是预期的输出是什么?我明白了,我知道了如何将awk命令放入一个循环“forf in folder”等,所以现在应该可以了,只要有一个awk命令可以用于单个文件1而不是文件2,那么我将把它集成到一个循环中。感谢您的帮助,您的第一个解决方案适用于许多文件。这个额外的问题实际上是针对一个稍有不同的数据集,其中file1中的区域要小得多,因此我忽略了file1中的范围在file2范围内的重叠,这在第一个数据集中从未发生过。所以,谢谢你的努力。我以前曾试图帮助你解决这个问题()。我建议您提供一个输入和预期输出的示例。否则,您将迫使我们猜测并构建我们自己的测试,而这些测试将不会像您提供给我们的那样准确。对于那些希望帮助你的人来说,这是时间和精力的损失。谢谢,我不知道你已经更新了答案来处理重叠范围的问题。我看一下,如果行得通,我就结束这个问题。我按照上面的要求添加了示例。否。我没有更新它。但是另一个线程更复杂,因为您要求遍历一个文件夹以查找文件并处理其中的每一个文件。我必须用我自己的(猜测的)数据创建所有这些文件,而且比第一眼看到的要多得多。我得到了,但是预期的输出是什么?我明白了,我知道了如何将awk命令放入一个循环“forf in folder”等,所以现在应该可以了,只要有一个awk命令可以用于单个文件1而不是文件2,那么我将把它集成到一个循环中。感谢您的帮助,您的第一个解决方案适用于许多文件。这个额外的问题实际上是针对一个稍有不同的数据集,其中file1中的区域要小得多,因此我忽略了file1中的范围在file2范围内的重叠,这在第一个数据集中从未发生过。因此,感谢您的努力已经有所帮助。我编辑了我的答案,并首先添加了您所需的输出。谢谢,这可能会有所帮助,但我需要输出为第2行中匹配的行,因为此信息稍后将用于引用第3个文件(此处未显示单独的任务。此外,第二个文件中有一些附加信息字段未显示在此处,因为在重叠中不需要这些字段。很抱歉,之前没有指定这些字段,我试图让问题尽可能简单。我删除了其他情况。如果每个文件中有更多参数,只需向打印行添加更多$…即可e、 注意,
if
语句中使用的$value可能会更改。但它很好用。我还想将它用于一些数据,其中文件2对应的数据有不同的列号。例如,文件2中的文件1$1=$3,文件2中的文件1$2=$5,文件2中的文件1$3=$6。我不完全理解您的脚本,所以您能告诉我哪些$value不是o替换到该文件会起作用吗?那么这就足够了,非常感谢。如果文件1中的每一行都有相同数量的字段,那么就很容易理解了。为了理解我的代码,我建议您执行
join file1 file2
,这样您就可以理解awk中的if语句。我编辑了我的答案,并首先添加了所需的输出。谢谢e有帮助,但我需要将输出作为第2行中匹配的行,因为此信息稍后将用于引用第3个文件(此处未显示单独的任务)。此外,第2个文件有一些附加信息字段,此处未显示,因为重叠中不需要这些字段。很抱歉之前未指定此字段,
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