我有一个包含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行。
希望这些例子有所帮助。
非常感谢您的帮助。
提前谢谢!
答案 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