如何根据 1 个字段的内容进行 awk 选择?

Mic*_*ant 2 awk

如何选择第二个字段为“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打印所有行。