0
我正在查看已经格式化得非常糟糕的数据 - 谁输入过数据并不是非常小心,以便与每行的字段顺序保持一致。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;
}
显示输入端口,以及你希望如何输出为。只看代码并调试它是非常困难的。 – Jotne