AWK 中的正则表达式

jos*_*shu 3 regex bash awk

我正在尝试使用 awk 模式解析以下输入:

史密斯,吉姆 12.34

12.34 吉姆·史密斯

我有一个模式检查,看看第一个字段是否包含字母字符,第二个字段是否包含字母字符,第三个字段包含一个数字,第二个模式检查第二种情况,如下所示:

$1 ~ /[A-Za-z]/ && $2 ~ /[A-Za-z]/ && $3 ~ /[0-9]/{
do fun things with record
}
$3 ~ /[A-Za-z]/ && $2 ~ /[A-Za-z]/ && $1 ~ /[0-9]/
{
this is the second form of the record
}
Run Code Online (Sandbox Code Playgroud)

但是,我的程序似乎通过了两项检查并执行了两项操作。我一直试图找出我哪里搞砸了,但同样的事情不断发生。任何方向正确的观点都值得赞赏。我知道有很多方法可以做到这一点。我发现了其中一些,但我想具体知道我在这里做错了什么。

我正在使用 awk 运行 CentOS 7:

gawk --version
GNU Awk 4.0.2
Run Code Online (Sandbox Code Playgroud)

mat*_*atz 5

问题是第二个模式之后的左大括号之前的换行符。这将按预期工作:

$1 ~ /[A-Za-z]/ && $2 ~ /[A-Za-z]/ && $3 ~ /[0-9]/{
 print "do fun things with record"
}
$3 ~ /[A-Za-z]/ && $2 ~ /[A-Za-z]/ && $1 ~ /[0-9]/{ # NO newline here
 print "this is the second form of the record"
}
Run Code Online (Sandbox Code Playgroud)

解释:AWK 程序由一系列对组成pattern { action },其中模式或操作可以省略。在模式和操作之间添加换行符将使 awk 将其解析为没有操作的模式,后跟没有模式的操作(即无条件执行的操作)。

底线:坚持 AWK 中的埃及括号