0

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

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"}}'  

如果

$1 

"AAABBBF43T5Y" 

即使是

"AABBBF 43T5Y"

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

有什么建议么?

好的,这有点令人困惑。

我有这样的事情:

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

我想检查每个字段。第一个可以包含任何字符,第二个可以包含数字等。但是空格是不允许的,所以它是不正确的,例如:

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

感谢您的反馈,很抱歉让您感到困惑。

4

1 回答 1

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

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

于 2013-04-08T12:04:05.070 回答