正则表达怀疑gawk

时间:2011-06-06 15:08:24

标签: regex gawk

我的csv数据文件是这样的

title,name,gender
MRS.,MADHU,Female
MRS.,RAJ KUMAR,male
MR.,N,Male
MRS.,SHASHI,Female
MRS.,ALKA,Female

现在您可以看到我想避免所有数据,如第2行和第3行(即没有空格或数据长度> = 3)

MRS.,RAJ KUMAR,male
MR.,N,Male

并将其放在名为rejected_list.csv的文件中,其余全部放在名为clean_list.csv的文件中

因此这是我的gawk脚本

gawk -F ',' '{ 
  if( $2 ~ /\S/  && 
      $1 ~ /MRS.|MR.|MS.|MISS.|MASTER.|SMT.|DR.|BABY.|PROF./ && 
      $3 ~ /M|F|Male|Female/) 
    print $1","$2","$3 > "clean_list.csv"; 
  else 
    print $1","$2","$3 > "rejected_list.csv" } ' \
< DATA_file.csv

我的问题是这个脚本没有识别'\ S'字符集(除了空格以外的所有字母)..它选择所有以S开头的单词或者有一个S而拒绝其余的单词

一个简单的正则表达式/([A-Z])/代替/ s工作得很好,但是当我设置{3,}的限制时,脚本失败了..

gawk -F ',' '{ 
      if( $2 ~ /([A-Z]){3,}/ &&
          $1 ~ /MRS.|MR.|MS.|MISS.|MASTER.|SMT.|DR.|BABY.|PROF./ && 
          $3 ~ /M|F|Male|Female/) 
        print $1","$2","$3 > "clean_list.csv"; 
      else 
        print $1","$2","$3 > "rejected_list.csv" } ' \
 < DATA_file.csv

我尝试了各种各样的正则表达式与'*','+'等组合,但我无法得到我想要的......

谁能告诉我这是什么问题?

2 个答案:

答案 0 :(得分:2)

对所有可打印和可见字符使用[:graph:]而不是\ S. GAWK不会将\ S识别为[:graph:]所以它不起作用。

此外,{3,}间隔表达式仅适用于posix或re-interval模式。

答案 1 :(得分:1)

我添加了拒绝条件:不完全是3个字段

gawk -F, '
  BEGIN { 
    titles = "MRS.|MR.|MS.|MISS.|MASTER.|SMT.|DR.|BABY.|PROF."
    genders = "M|F|Male|Female"
  }
  $1 !~ titles || $2 ~ /[[:space:]]/ || length($2) < 3 || $3 !~ genders || NF != 3 {
    print > "rejected_list.csv"
    next
  }
  { print > "clean_list.csv" }
' < DATA_file.csv