在AWK中打印字段号大于某个值的行

15

我正在编写一个Bash脚本,它需要接收并存储一个参数;

threshold = $1

然后我有一些类似这样的示例数据:

5 blargh
6 tree
2 dog
1 fox
9 fridge

我希望打印只有行号大于输入参数(阈值)的行。

我目前正在使用:

awk '{print $1 > $threshold}' ./file

但是什么也没有打印出来,希望能得到帮助。

1个回答

33

你很接近了,但需要更像这样:

$ threshold=3
$ awk -v threshold="$threshold" '$1 > threshold' file

使用-v创建变量可以避免在awk脚本中尝试扩展shell变量的丑陋。

编辑:

您展示的当前代码存在一些问题。首先,您的awk脚本是单引号括起来的(很好),这会阻止$threshold展开,因此该值永远不会被插入到脚本中。其次,您的条件应该放在花括号外面,即:

$1 > threshold { print }

这个方法是有效的,但`print`语句并不是必须的(因为它是默认的操作),所以我将其简化为:

This works, but the `print` is not necessary (it's the default action), which is why I shortened it to
$1 > threshold

嗯,这对我仍然不起作用,似乎没有匹配的内容并且没有任何输出,另外,将阈值设置为3的方式是否使其等于传递给脚本的参数? - user2296424
@user2296424:这只是一个例子。如果你的脚本参数为$1,你可以使用它代替。 - FatalError
可以了,谢谢!不过我还是有点困惑——这是怎么让它工作的?为什么不能按照我最初的想法去做呢? - user2296424
1
为了更好的可移携性,应该在 -v变量名 之间使用空格。旧版的OSX会因为缺少空格而出现问题。你还应该始终将变量用双引号括起来。另一种方法是在表达式后面放置变量,例如:awk '$1 > t' t="$threshold" file - Jotne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接