2016-02-24 45 views
0

我有两个文件用tab分隔。一个包含引理和词干,另一个包含你需要形成的语法形式。AWK - 形成语法形式

文件(引理和茎):

Lemma Stem Pos 
ablakzár ablakz noun 
adminisztrátorlány adminisztrátorl noun 
... 
.... 

文件(后缀):

suffix 
[r]as 
[r][r]er 
... 
..... 

有章可循,输出:

Lemma Stem Suffix Output 
ablakzár ablakz [r]as ablakzras 
adminisztrátorlány adminisztrátorl [r][r]er adminisztrátorlnnyer 


These are the grammar forms that I would have to create from the two lemmas: 
ablakzras 
adminisztrátorlnnyer 

也就是说,如果我只能找到在括号中的一个字母,我选择了最后一个外cons的辅音,我把它添加到词干中,如果我在括号中找到两个字母,我将最后一个字母加倍我把它添加到干。在括号内的字母后面加上。

表双辅音:

Single: b c cs d dz dzs f g gy h j k l ly m n ny p q r s sz t ty v w x y z zs 
Doubles: bb cc ccs dd ddz ddzs ff gg ggy hh jj kk ll lly mm nn nny pp qq rr ss ssz tt tty vv ww xx yy zz zzs 

最后,我解决了自己的问题。我展示的解决方案,以防止任何OP服务:

BEGIN { 
    OFS=FS="\t"; 

    while ((getline line < file) > 0) 
    { 
     models[++c]=line; 
    } 

    v="a o u ö ü e i á ó ú ő ű é í"; 
    a1=split(v,vocals," "); 

    doubled_consonants["b"]="bb"; doubled_consonants["c"]="cc"; 
    doubled_consonants["cs"]="ccs"; doubled_consonants["d"]="dd"; 
    doubled_consonants["dz"]="ddz"; doubled_consonants["dzs"]="ddzs"; 
    doubled_consonants["f"]="ff"; doubled_consonants["g"]="gg"; 
    doubled_consonants["gy"]="ggy"; doubled_consonants["h"]="hh"; 
    doubled_consonants["j"]="jj"; doubled_consonants["k"]="kk"; 
    doubled_consonants["l"]="ll"; doubled_consonants["ly"]="lly"; 
    doubled_consonants["m"]="mm"; doubled_consonants["n"]="nn"; 
    doubled_consonants["ny"]="nny"; doubled_consonants["p"]="pp"; 
    doubled_consonants["q"]="qq"; doubled_consonants["r"]="rr"; 
    doubled_consonants["s"]="ss"; doubled_consonants["sz"]="ssz"; 
    doubled_consonants["t"]="tt"; doubled_consonants["ty"]="tty"; 
    doubled_consonants["v"]="vv"; doubled_consonants["w"]="ww"; 
    doubled_consonants["x"]="xx"; doubled_consonants["y"]="yy"; 
    doubled_consonants["z"]="zz"; doubled_consonants["zs"]="zzs"; 

} 
{ 
    s1=split($1,lemma_letters,"") 
    for (i=1; i<=c; i++) 
    { 
     s2=split(mod[i],model,"\t"); 
     s3=split(model[4],suffix_letters,""); 

     for (j=1; j<=s3; j++) 
     { 
      switch (suffix_letters[j]) { 
      case "[": 
       wz=extrac_consonant($1,s1,doubled_consonants) 
       wa=double_single(j,s3,suffix_letters) 

       if (wa == 0) 
       { 
        tp=tp wz; 
        j+=2; 
       } 
       else 
       { 
        tp=tp doubled_consonants[wz]; 
        j+=5; 
       } 

       break; 
      default: 
       tp=tp ltrs[j]; 
       break; 
      } 
     } 
    } 

function extrac_consonant(string,leng,double) 
{ 
    # string - lemma 
    # leng - lemma length 
    # double - array (doubled_consonants) 

    q1=substr(string,(leng-2)); 
    q2=substr(string,(leng-1)); 
    q3=substr(string,leng); 

    if (double[q1]) 
    { 
     cons=q1; 
    } 
    else if (double[q2]) 
    { 
     cons=q2; 
    } 
    else 
    { 
     cons=q3; 
    } 
    return cons; 
} 
function double_single(x5,x6,arr5) 
{ 
    # x5 - j value in switch statement 
    # x6 - suffix length 
    # arr5 - array (suffix_letters) 

    flag=0; 
    for (g=(x5+1); g<=x6; g++) 
    { 
     if (arr5[g] == "[") 
     { 
      flag=1; 
     } 
    } 
    return flag; # It tells us, if we have to double the consonant or not [r] ó [r][r] 
} 

回答

1

awk来救援!我编写了一个原型你,你可以进一步延伸

$ awk 'NR>1{n=gsub("\\[","[",$1); 
      c=substr($2,length($2),1); 
      sub("\\[.*\\]","",$1); 
      for(i=1;i<=n;i++) $1=c""$1; 
      print $3 $1}' <(paste suffix lemma) 

ablakzras 
adminisztrátorlyyer 

音符,它选择的最后一个字符,不检查元音/辅音。我不确定你对双辅音做了什么?

代码应该很容易理解,如果没有,我可以进一步解释。

+0

正如你所见,我终于设法自己解决了这个问题。但你的专家建议总是欢迎! – Firefly