首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建匹配的括号- awk :sed

创建匹配的括号- awk :sed
EN

Stack Overflow用户
提问于 2016-03-21 10:12:58
回答 4查看 136关注 0票数 1

我有一个有三种模式的数据集:

第一:

代码语言:javascript
运行
复制
abrasion abrade:stem<>ion:suffix
abstainer abstain:stem<>er:suffix
abstention abstain:stem<>ion:suffix

第二:

代码语言:javascript
运行
复制
inaccurate in:prefix<>accurate:stem
inactive in:prefix<>active:stem

第三:

代码语言:javascript
运行
复制
incommunicable in:prefix<>communicate:stem<>able:suffix
incompatibility in:prefix<>compatible:stem<>ity:suffix

我需要将上面的表格转换成下面的表格:用宾州树状银行(http://languagelog.ldc.upenn.edu/myl/PennTreebank1995.pdf)的方式匹配括号

第一:

代码语言:javascript
运行
复制
abrasion ((abrade:stem) ion:suffix)
abstainer ((abstain:stem)er:suffix)
abstention ((abstain:stem)ion:suffix)

第二:

代码语言:javascript
运行
复制
inaccurate (in:prefix(accurate:stem))
inactive (in:prefix(active:stem))

第三:

代码语言:javascript
运行
复制
incommunicable (in:prefix ((communicate:stem)able:suffix))
incompatibility (in:prefix ((compatible:stem)ity:suffix))

代码,我正在使用awk

代码语言:javascript
运行
复制
{
    n = gsub(/<>/,")",$2)
    s = sprintf("%*s",n,"")
    gsub(/ /,"(",s)
    print "(" $1, s "((" $2 "))"
}

编辑

更复杂的形式

代码语言:javascript
运行
复制
nationalistic national: stem <>ism:suffix<>ist:suffix<>ic:suffix 

至:

代码语言:javascript
运行
复制
nationalistic ((((national: stem) ism:suffix)ist:suffix)ic:suffix)

它没有产生例子中提到的预期产出。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-03-21 12:01:02

这应该是足够普遍的,因为它考虑到:stem:prefix:suffix来进行匹配:

代码语言:javascript
运行
复制
awk 'BEGIN{FS=OFS="\n"}{
  a=gensub(/([a-zA-Z]*):stem/,"(\\1:stem)", "g");
  b=gensub(/(\([a-zA-Z]*:stem\))<>([a-zA-Z]*):suffix/,"(\\1\\2:suffix)", "g", a);
  c=gensub(/([a-zA-Z]*:prefix)<>(.*)/,"(\\1\\2)", "g", b);
  print c;}' testfile

这里的演示:https://ideone.com/U3ux91

编辑

这应该考虑到多个后缀和前缀:

代码语言:javascript
运行
复制
awk 'BEGIN{FS=OFS="\n"}{
   a=gensub(/([a-zA-Z]*):stem/,"(\\1:stem)", "g");
   while ( a ~ /stem)<>.*:suffix/) {
     a=gensub(/(\([a-zA-Z]*:stem\).*?)<>([a-zA-Z]*):suffix/,"(\\1\\2:suffix)", "g", a);
   }
   while ( a ~ /<>/) {
     a=gensub(/([a-zA-Z]*?:prefix)<>(.*)/,"(\\1\\2)", "g", a);
   }
   print a;}' test

演示:https://ideone.com/U7LYXi (抱歉,如果反民族主义不是一个词,而是为了测试.)

票数 1
EN

Stack Overflow用户

发布于 2016-03-21 10:31:39

模式1的预期输出可能有问题,括号不成对,我猜想是--它是排印的,应该是:

代码语言:javascript
运行
复制
abrasion ((abrade:stem)ion:suffix)
abstainer ((abstain:stem)er:suffix)
abstention ((abstain:stem)ion:suffix)

我制作了这个awk脚本:

代码语言:javascript
运行
复制
awk -v d="<>" '{$2="("$2")"}
$1~/^ab/{sub(d,")",$2);$2="(" $2}
$1~/^ina/{sub(d,"(",$2);$2=$2")"}
$1~/^inc/{sub(d,"((",$2);sub(d,")",$2);$2=$2")"}7' file

对于同一个文件中的3种模式示例,它提供:

代码语言:javascript
运行
复制
abrasion ((abrade:stem)ion:suffix)
abstainer ((abstain:stem)er:suffix)
abstention ((abstain:stem)ion:suffix)
inaccurate (in:prefix(accurate:stem))
inactive (in:prefix(active:stem))
incommunicable (in:prefix((communicate:stem)able:suffix))
incompatibility (in:prefix((compatible:stem)ity:suffix))
票数 1
EN

Stack Overflow用户

发布于 2016-03-24 14:57:46

代码语言:javascript
运行
复制
awk -F'<>| ' -v OFS= '{ 
    $1 = $1 " " 
    for (i=2; i<=NF; i++) { 
        if ($i ~ /prefix$/)    { $i = "(" $i; $NF = $NF ")" } 
        if ($i ~ /stem\)?$/)   { stem = i; $i = "(" $i ")" } 
        if ($i ~ /suffix\)?$/) { $i = $i ")"; $stem = "(" $stem } } 
    } { print }'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36128175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档