我正在尝试使用awk模式解析以下输入:
史密斯,吉姆12.34 12.34 Jim Smith我有一个模式检查是否第一个字段包含一个字母字符,第二个字段包含一个字母字符,第三个字段包含一个数字,第二个模式检查第二个案例,如下所示:
$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
}
但是,我的程序似乎正在通过两个检查并执行这两个操作。我一直试图找出我搞砸的地方,但同样的事情一直在发生。任何正确方向的点都非常感谢。我知道有很多方法可以做到这一点。我发现其中的一些,但我想知道我在这里做错了什么。
我用awk运行CentOS 7:
gawk --version
GNU Awk 4.0.2
答案 0 :(得分:4)
问题是在第二个模式之后的开口括号之前的换行符。这将按预期工作:
$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"
}
解释:AWK程序由一对pattern { action }
对组成,其中 模式或动作可以省略。在模式和动作之间添加换行符将使awk解析为没有动作的模式,然后是没有模式的动作(即无条件执行的动作)。
底线:在AWK中坚持Egyptian Brackets。
答案 1 :(得分:1)
如果您的字段包含字母和数字值,它将通过两个测试。例如。
$ echo "James007" | awk '/[a-zA-Z]/{print "alpha"} /[0-9]/{print "number"}'
将同时打印。如果你想限制只有alpha和数字,你可以这样做
$ echo "James 007" | awk '$1~/^[a-zA-Z]+$/{print "alpha"} $2~/^[0-9]+$/{print "number"}'