2013-10-30 50 views
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; 

} 
+1

显示输入端口,以及你希望如何输出为。只看代码并调试它是非常困难的。 – Jotne

回答

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