使用条件 awk 语句来控制正则表达式模式

使用条件 awk 语句来控制正则表达式模式

我的代码可以解析 csv 文件,然后根据正则表达式检查每个字段。但是,如果另一个字段中有数据,则有一些字段需要是强制性的,因此我本质上需要一个条件块来控制数据流。因此示例文件的示例见下文

 "S","HEY","J","B","0",""

所以我需要的是一种表达方式

if $1 == "S"
USE THIS regex ($3~/^("[A-Z0-9]{1}")$/) {print "3RDfield invalid-HEADER-FILE";}
else 
USE THIS REGEX ($3~/^("")$/) {print "3RDfield invalid-HEADER-FILE";}

我尝试过使用内联版本

$1== "S" && ($3~/^"[A-Z0-9]{1}"$/) {print "3RD field invalid-HEADER-      FILE";}  
$1 != "S" && ($3~/^("")$/) {print "3RDfield invalid-HEADER-FILE";}

答案1

 {
   if ($1 == "\"S\"")
     regex = "^\"[[:upper:][:digit:]]\"$"
   else
     regex = "^\"\"$"
 }
 $5 ~ regex {print "error"}

或者使用三元运算符:

 $5 ~ ($1 == "\"S\"" ? "^\"[[:upper:][:digit:]]\"$" : "^\"\"$") {
   print "error"
 }

请注意[A-Z], ,[0-9]可以(实际上有时确实)匹配除 C 之外的语言环境中的任何内容,而[[:digit:]]匹配[0123456789][[:upper:]] 大写字母(语言环境中的所有字母,不一定限于没有变音符号的拉丁字母)。

{1}是多余的。

相关内容