我正在查看已被严重格式化的数据 - 曾经输入数据的人并没有非常小心地与每行字段的顺序保持一致。
我已经创建并找到了常见和不常见的名字、姓氏、前缀和后缀的字典,并且我正在尝试遍历数据以阐明哪些记录属于哪种类型。
我的代码可以识别名字,如果它是姓氏、男性名字、女性名字和首字母,就会吐出。它卡在前缀和后缀上——即使所有输入文件都是以完全相同的方式创建的,似乎甚至都没有读取输入文件——它们是通过在行尾按“enter”来划分的。
我曾尝试分别编写每一段代码,然后它就可以工作,但当我把它放在一起时,它就失败了。
有没有人有任何想法?
BEGIN{
print "Loading tables... " > "/dev/stderr";
while ((getline < "dist.all.last") > 0)
last[toupper($1)] = $2;
while ((getline < "dist.female.first") > 0)
female[toupper($1)] = $2;
while ((getline < "dist.male.first") > 0)
male[toupper($1)] = $2;
while((getline < "suffixes") > 0)
suffix[toupper($1)]= 0;
while((getline < "prefixmale") > 0)
prefixm[toupper($1)]=0;
while((getline < "prefixfemale") > 0)
prefixf[toupper($1)]=0;
while((getline < "prefixneutral") > 0)
prefixn[toupper($1)]=0;
print "DONE loading tables... " > "/dev/stderr";
FS = "|";
}
function bestGuess(w, val, ans){
val = 0.0;
ans = w;
if (w in last){
val = last[w];
ans = "l";
}
if ((w in female) && (female[w] > val)){
val = female[w];
ans = "f";
}
if ((w in male) && (male[w] > val)){
val = male[w];
ans = "m";
}
if (length(w) == 1){
ans = "i"; # its an initial
}
if (w in suffixm){
ans = "s";
}
if(w in prefixm){
ans = "mp"
}
if(w in prefixf){
ans = "fp"
}
if(w in prefixn){
ans = "np"
}
return ans;
}
{
numWords = split(toupper($8), words, /[^A-Za-z]+/);
if (numWords > 0)
key = bestGuess(words[1]);
for(i=2; i <= numWords; i++)
if (length(words[i]) > 0)
key = key " " bestGuess(words[i]);
print key "|" $8;
}