我正在尝试使用 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)
问题是第二个模式之后的左大括号之前的换行符。这将按预期工作:
$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 中的埃及括号。