【问题标题】:regex doubt in gawkgawk 中的正则表达式疑问
【发布时间】:2011-06-06 23:44:37
【问题描述】:

我的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 ~ /([A-Z])\{3,\}/ &amp;&amp; etc.

标签: regex gawk


【解决方案1】:

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

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

【讨论】:

  • 有没有办法让 Gawk 理解 posix 模式。通过设置一些标准变量......如果你想忽略大小写,比如 IGNORECASE = 1
  • 他们是傻瓜command line options:gawk --re-interval ...
【解决方案2】:

我添加了一个拒绝条件:不完全是 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

【讨论】:

  • Glenn 使用[[:space:]] 并为titlesgenders 声明变量是解决问题的更好方法。祝你好运。
猜你喜欢
  • 1970-01-01
  • 2022-11-29
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
相关资源
最近更新 更多