如果没有匹配,请在awk中添加加号或减号

时间:2016-03-15 20:48:43

标签: regex awk

我正在尝试匹配以下文件中的所有行以匹配。 awk会这样做,问题是不匹配的行应该在正负10之内。我不知道如何告诉awk如果找不到匹配则使用plusminus 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

3 个答案:

答案 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行以获得保证金匹配