使用awk搜索小数范围

时间:2016-09-14 01:42:37

标签: awk

我希望这不是一个太天真的问题。我有一组文件,其中包含一堆以分号分隔的项目,其中一些是数字。示例如下:

A;B;4.564;C;D;E;5.698;F;G;H;7.893

等等。

在这些文件中,数字可能略有不同,例如,上例中的5.698可能是5.691,或其他文件中的5.703等。所以,我建立了一个搜索范围,比如从5.685到5.710。代码很好,直到实际执行此搜索的awk单行,但我被困在那里。这是awk代码:

awk -v low=$NUM3 -v high=$NUM2 '{if ($0 >= low && $0 <= high) {print "1"} else {print "0"} }'

我将bash变量导入awk以表示搜索范围,然后在低值和高值之间存在数字时设置简单搜索。我也尝试了其他变体:

awk -v low=$NUM3 -v high=$NUM2 'low<=$0 && $0<=high'

任何帮助将不胜感激,我搜索过以前的问题,但没有遇到这个特定的问题。无论如何我都不是awk专家,所以提前谢谢。

1 个答案:

答案 0 :(得分:1)

你的第一个单行中的$0表示你匹配的整行,所以它可能没有做你想要的。如果你想分别处理每个令牌,你必须设置一个字符来分开(在你的例子中看起来像;)并使用awk for循环,如下所示:

awk -F\; '{ for (i=1; i<=NF; i++) { print $i }}'

在循环内部,您可以检查范围内的数字,如下所示:

awk -F\; -v low=$NUM3 -v high=$NUM2 '{n=0; for (i=1; i<=NF; i++) { if ($i >= low && $i <= high) { n++; }} print n}'

具有更清晰的格式,如下所示:

awk -F\; -v low=$NUM3 -v high=$NUM2 '{n=0;
                                      for (i=1; i<=NF; i++) { 
                                         if ($i >= low && $i <= high) { 
                                           n++; 
                                         }
                                      } 
                                      print n;}'

这将打印它在每行的给定范围内找到某些内容的次数。