用 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
到目前为止我尝试了什么:
我试图将@EdMorton 提供的解决方案改编成类似的问题:Comparing two columns in two files using awk
awk 'NR==FNR{a[,];next} (,) in a' file1 file2
这个问题和我的主要区别在于他们在两个文件中搜索完全相同的范围。在我的例子中,数字范围只能是部分的(只有一个位置)。使用此解决方案,我搜索更改表达式 (,) in a
以将 file2 的范围与存储在数组中的范围进行比较。没有任何成功。
我尝试了不在数组中存储数值范围而是单独存储数字(文件 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
这种方法也没有正常工作。
最后,我还尝试了这样的 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
我有一个包含 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
到目前为止我尝试了什么:
我试图将@EdMorton 提供的解决方案改编成类似的问题:Comparing two columns in two files using awk
awk 'NR==FNR{a[,];next} (,) in a' file1 file2
这个问题和我的主要区别在于他们在两个文件中搜索完全相同的范围。在我的例子中,数字范围只能是部分的(只有一个位置)。使用此解决方案,我搜索更改表达式 (,) in a
以将 file2 的范围与存储在数组中的范围进行比较。没有任何成功。
我尝试了不在数组中存储数值范围而是单独存储数字(文件 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
这种方法也没有正常工作。
最后,我还尝试了这样的
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