gawk NR和匹配问题
我需要使用正则表达式来解析数据文件的特定行。我的带有match的test命令起作用,我的特定行号的test命令起作用,但是当我把它们放在一起时,我没有得到任何输出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
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行匹配。