Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Validation AWK脚本无法识别密钥_Validation_Parsing_Awk - Fatal编程技术网

Validation AWK脚本无法识别密钥

Validation AWK脚本无法识别密钥,validation,parsing,awk,Validation,Parsing,Awk,我看到的数据格式非常糟糕——输入数据的人没有非常小心地与每行字段的顺序保持一致 我已经创建并找到了常见和不常见的名字、姓氏、前缀和后缀的字典,我正试图通过数据循环,澄清哪一条记录属于哪一种类型 我的代码识别这些名字,如果是姓氏、男性名字、女性名字和首字母缩写,就会吐出来。它卡在前缀和后缀上——即使所有输入文件都是以完全相同的方式创建的,但似乎都没有读取输入文件——它们通过按行末尾的“enter”来划分 我试着分别编写每一段代码,然后它就可以工作了,但当我把它放在一起的时候,它却失败了 有人有什么

我看到的数据格式非常糟糕——输入数据的人没有非常小心地与每行字段的顺序保持一致

我已经创建并找到了常见和不常见的名字、姓氏、前缀和后缀的字典,我正试图通过数据循环,澄清哪一条记录属于哪一种类型

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

}
开始{
打印“加载表…”>“/dev/stderr”;
而((getline<“dist.all.last”)>0)
最后一个[toupper($1)]=2美元;
而((getline<“dist.female.first”)>0)
女性[toupper($1)]=2美元;
而((getline<“dist.male.first”)>0)
男性[toupper($1)]=2美元;
而((getline<“后缀”)>0)
后缀[toupper($1)]=0;
而((getline<“prefixmale”)>0)
prefixm[toupper($1)]=0;
而((getline<“prefixfemale”)>0)
prefixf[toupper($1)]=0;
而((getline<“prefixneutral”)>0)
前缀n[toupper($1)]=0;
打印“已完成加载表…”>“/dev/stderr”;
FS=“|”;
}
函数bestGuess(w、val、ans){
val=0.0;
ans=w;
如果(最后为w){
val=最后一个[w];
ans=“l”;
}
如果((女性为w)和(&(女性[w]>val)){
val=女性[w];
ans=“f”;
}
if((公螺纹中的w)和&(公螺纹[w]>val)){
val=男性[w];
ans=“m”;
}
如果(长度(w)==1){
ans=“i”#是首字母
}
if(w在后缀x中){
ans=“s”;
}
if(前缀为w){
ans=“mp”
}
if(前缀为w的XF){
ans=“fp”
}
if(前缀为w){
ans=“np”
}
返回ans;
}
{
numWords=split(toupper($8),单词,/[^A-Za-z]+/);
如果(numWords>0)
关键字=最佳猜测(单词[1]);
对于(i=2;i 0)
关键字=关键字“”最佳猜测(单词[i]);
打印键“|”$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

显示输入,以及您希望输出的方式。仅仅看代码并调试它,是非常困难的。