我正在尝试匹配以下文件中的所有行以匹配。 awk
会这样做,问题是不匹配的行应该在正负10之内。我不知道如何告诉awk
如果找不到匹配则使用plus
或minus
file
中的坐标。如果之后未找到匹配项,则文件中不存在匹配项。谢谢你:)。
文件
955763
957852
976270
大文件
chr1 955543 955763 chr1:955543-955763 AGRN-6|gc=75
chr1 957571 957852 chr1:957571-957852 AGRN-7|gc=61.2
chr1 970621 970740 chr1:970621-970740 AGRN-8|gc=57.1
AWK
awk 'NR==FNR{A[$1];next}$3 in A' file bigfile > output
所需输出(与bigfile相同)
chr1 955543 955763 chr1:955543-955763 AGRN-6|gc=75
chr1 957571 957852 chr1:957571-957852 AGRN-7|gc=61.2
答案 0 :(得分:2)
如果匹配的行和关闭的行之间没有区别,则可以设置数组范围内的所有键:
awk 'NR == FNR { for (i = -10; i <= 10; ++i) A[$1+i]; next }
$3 in A' file bigfile > output
这种方法的优点是每个大文件只执行一次查找。
答案 1 :(得分:1)
您需要在数组a
上运行循环:
awk 'NR==FNR {
a[$1]
next
}
{
for (i in a)
if (i <= $3+10 && i >= $3-10)
print
}' file bigfile > output
答案 2 :(得分:1)
您的数据已经产生了所需的输出(完全匹配)。
$ awk 'NR==FNR{a[$1];next} $3 in a{print; next}
{for(k in a)
if((k-$3)^2<=10^2) {print $0, " --> within 10 margin"; next}}' file bigfile
chr1 955543 955763 chr1:955543-955763 AGRN-6|gc=75
chr1 957571 957852 chr1:957571-957852 AGRN-7|gc=61.2
chr1 976251 976261 chr1:976251-976261 AGRN-8|gc=57.1 --> within 10 margin
我添加了假的第4行以获得保证金匹配