Выражение сомнений в gawk - PullRequest
1 голос
/ 06 июня 2011

Мой файл данных 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

Myпроблема в том, что этот скрипт не распознает набор символов '\ 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

я пробовал все виды сочетания регулярного выражения с '*', '+' и т. д., но я не могу получить то, что хочу ...

Может кто-нибудь сказать мне, в чем проблема?

Ответы [ 2 ]

2 голосов
/ 06 июня 2011

Используйте [: graph:] вместо \ S для всех печатных и видимых символов. GAWK не распознает \ S как [: graph:], поэтому он не будет работать.

Кроме того, выражение интервала {3,} работает только в режимах posix или re-interval.

1 голос
/ 06 июня 2011

Я добавил условие отклонения: не совсем 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
...