【发布时间】:2020-07-01 20:11:13
【问题描述】:
我需要使用正则表达式来解析数据文件的特定行。我的带有 match 的测试命令有效,我的特定行号的测试命令有效,但是当我把它们放在一起时,我没有得到任何输出。
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 之间的 &&
【问题讨论】:
-
使用
&&逻辑和? -
omg,我太笨了,太累了,谢谢,我刚刚忘记了 &&,奇怪的是它只是安静地死掉而不是抛出错误
-
awk工具的语法非常宽松。如果不能将相邻的表达式合二为一,它将始终尝试连接它们。在这种情况下,match() 返回值 '1' 附加到 '42',所以这个模式只会匹配第 421 行。
标签: awk