AWK 脚本无法识别密钥



>我正在查看格式不正确的数据 - 输入数据的人没有非常小心地与每行字段的顺序保持一致。

我已经创建并找到了常见和不常见名字,姓氏,前缀和后缀的词典,我正在尝试循环数据以澄清哪个记录属于什么类型。

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

您可以尝试在程序开头插入 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

最新更新