awk匹配模式没有空格

时间:2013-04-08 11:45:24

标签: regex unix awk

我需要匹配文档第一行中的模式。字段分隔符是“:”,并且我希望在未遵循模式时收到错误消息。我需要区分有和没有空格的字段。我使用这样的东西:

awk -F ":" '{if (($1 ~/^@[A-Za-z0-9]*/) && ($2 ~/[0-9]*/) && ($3 ~/[0-9]*/) && ($4 ~/[0-9]*/) && ($5 ~/[0-9]+/)){print "ok"} else { print "no"}}'  

如果

我得到“OK”
$1 

"AAABBBF43T5Y" 

即使是

"AABBBF 43T5Y"

当$ 1或其他字段中有空格时,我需要得到“否”。

有什么建议吗?

好的,这有点令人困惑。

我有这样的事情:

@HWUSI-EAS100R:6:73:941:1973#0/1

我想检查每个字段。第一个可以包含任何字符,第二个只包含数字等。但是不允许使用空格,因此它不正确:

@HWUSI-E AS100R:6:73:9 41:1973#0/1

感谢您的反馈,并对此感到困惑感到抱歉。

1 个答案:

答案 0 :(得分:2)

您的示例和措辞非常混乱,但似乎您要检查第一个字段是否包含空格。你可以这样做:

$ cat file
AABBBF43T5Y:f2:f3
AABBBF 43T5Y:f2:f3

$ awk -F: '$1~/ /{print "FAIL LINE: ",NR;next}{print "PASS LINE:",NR}' file
PASS LINE: 1
FAIL LINE: 2

如果您只是想检查打印输出的条件,可以更简单地编写,如果您想要其他任何事情,前面的块结构允许更容易修改:

$ awk -F: '{print $1~/ /?"FAIL":"PASS","LINE:",NR}' file
PASS LINE: 1
FAIL LINE: 2

如果您清楚地描述问题,发布代表性输入文件和预期输出,您将获得更好的答案。

修改

只要正则表达式匹配与^$锚定并且只包含允许的字符,那么就不会有空格:

$ cat file
@HWUSI-EAS100R:6:73:941:1973#0/1
@HWUSI-E AS100R:6:73:9 41:1973#0/1

$ awk -F: '$1~/^@[a-zA-Z0-9-]*$/&&$2~/^[0-9]*$/{print "PASS",NR;next}{print "FAIL",NR}' file
PASS 1
FAIL 2

因此$2~/^[0-9]*$/仅在正则表达式匹配且正则表达式为:

时才会被评估为真
^      # Match start of field
[0-9]* # Zero or more digits
$      # The end of the field

这将允许空白字段或仅数字字段。