gawk NR和匹配问题

gawk NR和匹配问题,awk,Awk,我需要使用正则表达式来解析数据文件的特定行。我的带有match的test命令起作用,我的特定行号的test命令起作用,但是当我把它们放在一起时,我没有得到任何输出 gawk 'NR==42 {print $0}' filename 打印出第42行的全部内容 gawk 'match($0, /([0-9]+)/, a) {print NR ":" a[1]}' filename 有很多打印输出,但具体有以下输出: 42:137674 所以,我的第42行有一个数字匹配 gawk 'NR==42

我需要使用正则表达式来解析数据文件的特定行。我的带有match的test命令起作用,我的特定行号的test命令起作用,但是当我把它们放在一起时,我没有得到任何输出

gawk 'NR==42 {print $0}' filename
打印出第42行的全部内容

gawk 'match($0, /([0-9]+)/, a) {print NR ":" a[1]}' filename
有很多打印输出,但具体有以下输出: 42:137674 所以,我的第42行有一个数字匹配

gawk 'NR==42 match($0, /([0-9]+)/, a) {print NR ":" a[1]}' filename
没有打印任何东西,我也不知道为什么

我有一个解决办法:

gawk 'match($0, /([0-9]+)/, a) {if (NR==42) print NR ":" a[1]}' filename
但我认为它的性能较差,所以我想找出另一个命令不起作用的原因

编辑:
回答,我完全忘记了NR和match之间的&&快速回答:问题的解决方案是添加缺少的and运算符:

NR==42 && match($0, /([0-9]+)/, a) 
 
OP中发生了什么?

Awk程序通常编写为一组模式动作对:

pattern { action }
模式
为真时,执行
操作

上面使用的
模式
如下所示:

NR==42 match($0, /([0-9]+)/, a)
由于运算符的优先顺序,它实际上类似于:

NR == (42  match($0, /([0-9]+)/, a))
为了举例,让我们假设我们在
NR==42
。match函数返回
0
1
,具体取决于是否找到匹配项。如OP中所述,
match
函数在
NR==42
的情况下返回
1
模式现在显示为:

42 == (42 1)
形式为
expr-expr
的运算符类似于字符串串联,因此在awk中,它被处理为

42 == ("42" "1")
42 == "421"
运算符
==
是数值运算符,当且仅当两个操作数都是自然数值时。但是
“421”
是一个字符串,因此它会将
NR
的数值转换为字符串:

"42" == "421"
这是错误的,因此将不会执行
操作


注意:当且仅当
match
函数在
420
行返回false,或在
421
行返回true时,上述操作才会执行。使用
&
逻辑and?omg,我太笨了,太累了,谢谢,我刚刚忘记了&&,奇怪的是,它只是静静地死去,而不是抛出一个错误
awk
工具有一个非常宽容的语法。如果无法将相邻表达式转换为一个表达式,它将始终尝试连接它们。在本例中,match()返回一个附加到'42'的值'1',因此此模式仅在第421行匹配。