AWK脚本无法识别密钥

时间:2013-10-30 13:04:37

标签: validation parsing awk

我正在查看格式非常糟糕的数据 - 输入数据的人并不十分谨慎,以便与每行的字段顺序保持一致。

我创建并发现了常见和不常见的名字,姓氏,前缀和后缀的字典,我试图循环显示哪种记录属于哪种类型的数据。

我的代码识别名称,如果它是姓氏,男性名字,女性名字和姓名首字母,则会吐出。它被卡在前缀和后缀上 - 似乎甚至都没有读取输入文件,即使所有输入文件都以完全相同的方式创建 - 它们通过在行尾按“输入”进行划分。

我已经尝试分别对每一段代码进行操作,然后它可以正常工作,不知怎的,当我把它放在一起时就失败了。

有没有人有任何想法?

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;

}

1 个答案:

答案 0 :(得分: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