我需要匹配文档第一行中的模式。字段分隔符是“:”,并且我希望在未遵循模式时收到错误消息。我需要区分有和没有空格的字段。我使用这样的东西:
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
感谢您的反馈,并对此感到困惑感到抱歉。
答案 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
这将允许空白字段或仅数字字段。