0

我正在查看已被严重格式化的数据 - 曾经输入数据的人并没有非常小心地与每行字段的顺序保持一致。

我已经创建并找到了常见和不常见的名字、姓氏、前缀和后缀的字典,并且我正在尝试遍历数据以阐明哪些记录属于哪种类型。

我的代码可以识别名字,如果它是姓氏、男性名字、女性名字和首字母,就会吐出。它卡在前缀和后缀上——即使所有输入文件都是以完全相同的方式创建的,似乎甚至都没有读取输入文件——它们是通过在行尾按“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;

}
4

1 回答 1

0

您可以尝试在程序开头插入 som 调试代码,以检查数组是否定义良好。例如,在该行之前:

numWords = split(toupper($8), words, /[^A-Za-z]+/);

你可以插入:

for (w in prefixm) {
   print w,prefixm[w]
}
print
for (w in prefixf) {
   print w,prefixf[w]
}
print
for (w in prefixn) {
   print w,prefixf[w]
}
exit
于 2013-10-30T16:38:25.823 回答