1

我的 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 的单词并拒绝其余单词

像 /([AZ])/ 这样的简单正则表达式代替 /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

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

谁能告诉我有什么问题?

4

2 回答 2

2

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

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

于 2011-06-06T15:43:56.303 回答
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
于 2011-06-06T15:43:22.557 回答