我的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
我尝试了各种各样的正则表达式与'*','+'等组合,但我无法得到我想要的......
谁能告诉我这是什么问题?
答案 0 :(得分:2)
对所有可打印和可见字符使用[:graph:]而不是\ S. GAWK不会将\ S识别为[:graph:]所以它不起作用。
此外,{3,}间隔表达式仅适用于posix或re-interval模式。
答案 1 :(得分: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