我希望这不是一个太天真的问题。我有一组文件,其中包含一堆以分号分隔的项目,其中一些是数字。示例如下:
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专家,所以提前谢谢。
答案 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;}'
这将打印它在每行的给定范围内找到某些内容的次数。