2015-12-27 2 views
-3

У меня есть файл csv, разделенный запятой, который содержит список прилагательных. Мне нужно извлечь корень и суффикс каждого из них. Можно ли это сделать с помощью AWK?Разбор слов в (корень, суффикс) в 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 

ответ

2

Возможно да, но это требует более сложной программы AWK:

script.awk:

BEGIN{ 
    FS="," 
} 

# Get the stem and type through comparison between $1 and $2 
!stem[$1]{ 
    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 
} 

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

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

Назовите это:

awk -f script.awk input.file 

Примечание: awk испортит порядок ввода сортировки. Если вас это волнует, вы можете направить вывод для сортировки:

awk -f script.awk input.file | sort 
+1

Предположительно, «стебель» - это часть, которая является инвариантной между всеми формами прилагательного. Это не обязательно самый длинный общий суффикс в первом экземпляре, хотя он работает в двух приведенных примерах. Если это просто испанский, и файл сортируется так, что второй столбец, как гарантируется, будет в алфавитном порядке в рамках общих записей, то это предположение может работать. Но если порядок грамматический, тогда он будет терпеть неудачу с прилагательными типа «veloz» (гендерно-инвариантные, множественные «скорости»). Это может также иметь проблемы со словами, чей акцентный маркер отличается во множественном числе. (afín, afines) – rici

+0

@rici Это был на самом деле испанский. Когда я задал вопрос, у меня не было исходного файла. Файл находится на датском языке. Какой код вы бы предложили? – Polucho

+0

@rici Да, вы правы. * stem * здесь не правильный термин. Я только пытался решить проблему, как описано в вопросе. Я не владею испанским языком, но могу сказать, что по-немецки он тоже не будет работать из-за нарушений. – hek2mgl