Bash 在AWK中将单词解析为(词根、后缀)

Bash 在AWK中将单词解析为(词根、后缀),bash,awk,Bash,Awk,我有一个逗号分隔的csv文件,其中包含一个形容词列表。我需要提取每个的根和后缀。有可能用AWK做这个吗 输入文件: ypperlig;ypperlig;adj.;1 ypperlig;ypperlige;adj.;2 ypperlig;ypperligt;adj.;3 ypperlig;ypperligst;adj.;5 vunden;vunden;adj.;1 vunden;vundne;adj.;2 vunden;vundent;adj.;3 vunden;vundnest;adj.;5

我有一个逗号分隔的csv文件,其中包含一个形容词列表。我需要提取每个的根和后缀。有可能用AWK做这个吗

输入文件:

ypperlig;ypperlig;adj.;1
ypperlig;ypperlige;adj.;2
ypperlig;ypperligt;adj.;3
ypperlig;ypperligst;adj.;5
vunden;vunden;adj.;1
vunden;vundne;adj.;2
vunden;vundent;adj.;3
vunden;vundnest;adj.;5
所需的输出文件:

ypperlig,ypperlig,adj., ,e,t,*,st
vunden,vund,adj., ,ne,ent,*,nest
如果第4列中缺少序号,如这两个示例中所示,则必须用星号替换空格

hek2mgl代码:

BEGIN{
FS=";"
}

{
split($1,a,"")
split($2,b,"")

s=""
for(i in a)
{ 
    if(b[i]!=a[i])
    {
        break;
    }
    s = s "" a[i]
}

    stem[$1]=s;
    type[$1] = $3
}

{
    suf[$1] = suf[$1] "," substr($2,length(stem[$1])+1)
}


END {
for(i in stem) 
{
    printf "%s,%s, %s\n",i,stem[i],type[i],suf[i]
}   
}
输出:

ypperlig,ypperlig,adj.,,e,t,st
vunden,vund,adj.,,ne,t,nest => wrong

ypperlig,ypperlig,adj., ,e,t,st    
vunden,vund,adj., ,ne,ent,nest

可能是,但需要更复杂的awk程序:

script.awk:

叫它:

awk -f script.awk input.file
注意:
awk
将打乱输入排序顺序。如果您关心这一点,可以通过管道将输出进行排序:

awk -f script.awk input.file | sort

据推测,“词干”是形容词所有形式之间不变的部分。在第一个实例中,这不一定是最长的通用后缀,尽管在所提供的两个示例中它是有效的。如果这只是西班牙语,并且对文件进行了排序,以确保第二列在公共条目中按字母顺序排列,那么该假设可能会起作用。但是如果顺序是语法上的,那么像“veloz”(性别不变性,复数“veloces”)这样的形容词就不会起作用。它也可能在重音标记复数形式不同的单词上遇到问题。(afín,afines)@rici它实际上是西班牙语。我问这个问题时没有原始文件。文件是丹麦语的。你会建议什么代码?@rici是的,你是对的。stem在这里不是合适的术语。我只是想解决问题中描述的问题。我不精通西班牙语,但可以说,在德语中,由于不规则,它也不起作用。@hek2mlg脚本的输出不完全正确。“vunden,vund,adj.,,ne,t,nest”正确的说法是“vunden,vund,adj.,,ne,ent,nest”@hek2mgl:是的,我应该更清楚,但问题在编辑时是显而易见的。第一次看到单词时,可以缓存词干,但真正的通用前缀可能会变短。您需要收集所有变体以正确识别最长的通用前缀。
awk -f script.awk input.file | sort