2011-06-06 54 views
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 

我已經試過各種正則表達式的組合與「 *','+'等,但我不能得到我想要的...

誰能告訴我什麼是問題M&

+0

我對轉換字符有一些好運 - 所以'$ 2〜/([AZ])\ {3,\}/&&等等' – 2011-06-06 15:43:26

回答

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 
+0

Glenn使用'[[:space:]] '並且爲'titles'和'gender'聲明變量是更好的解決你的問題的方法。祝你好運。 – shellter 2011-06-06 15:48:14

2

用[:圖表:]而不是\ S的所有可打印和可見字符。 GAWK不會將\ S識別爲[:graph:],因此它不起作用。

此外,{3}區間表達式僅適用於posix或re-interval模式。

+0

有沒有方法讓Gawk瞭解posix模式。通過設置一些標準變量...如IGNORECASE = 1如果你想忽略大小寫 – Crazyshezy 2011-06-06 15:59:32

+0

他們是gawk [命令行選項](http://www.gnu.org/software/gawk/manual/gawk.html#Options ):'gawk --re-interval ...' – 2011-06-06 16:28:34

+0

謝謝glenn,我一直在尋找 – Crazyshezy 2011-06-07 06:28:48