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を含むすべての単語を選択し、残りを拒否しています

/s の代わりに /([AZ])/ のような単純な正規表現は完全に機能しますが、{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

すべての印刷可能および可視文字には、\S の代わりに [:graph:] を使用します。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 に答える