如何选择第二个字段为“2”的所有记录?
我的数据是:
$ cat numbers.txt
1 2 3 4 5 6 7 8
2 4 6 8 10 12 14 16
3 6 9 12 15 18 21 24
Run Code Online (Sandbox Code Playgroud)
我的 awk 是:
awk '$2 - /^2$/ {print}' numbers.txt
Run Code Online (Sandbox Code Playgroud)
但我得到了所有行,而不仅仅是第一行:
1 2 3 4 5 6 7 8
2 4 6 8 10 12 14 16
3 6 9 12 15 18 21 24
Run Code Online (Sandbox Code Playgroud)
cuo*_*glm 10
$ awk '$2 ~ /^2$/' file
Run Code Online (Sandbox Code Playgroud)
或者使用==
像@glenn jackman's answer这样的相等运算符。
但是让我们看看您之前的解决方案,以解释为什么您获得了所有行。
awk '$2 - /^2$/ {print}' numbers.txt
Run Code Online (Sandbox Code Playgroud)
在这里,每一行输入,如果表达式$2 - /^2$/
为真,你将打印这一行,否则什么都不做。因为你得到了所有的行,所以似乎表达式$2 - /^2$/
总是被评估为真。
如何awk
评估该表达式?
使用减法运算符时,类型结果为数值。$2
变量是一个数字,但它/^2$/
是一个正则表达式,它的数值是多少?
好吧,来自POSIX awk 文档:
当 ERE 标记作为表达式出现在任何上下文中而不是作为“~”或“!~”运算符的右侧或作为下面描述的内置函数参数之一出现时,结果表达式的值应为相当于:
$0 ~ /ere/
所以,你的awk
程序变成:
awk '$2 - ($0 ~ /^2$/) {print}' numbers.txt
Run Code Online (Sandbox Code Playgroud)
您可以看到,每个输入行都将使用正则表达式进行检查/^2$/
。由于您的输入行均不匹配,因此表达式的结果$0 ~ /^2$/
将为 0。
使用您的输入,所有第二个字段的值都大于 0(减去 0 使其不变),这是awk
. 所以表达式$2 - /^2$/
始终为真,导致awk
打印所有行。