如何找出那些在一个单词中重复一个字符两次以上的单词(例如"aa,aaxx")



我想从文本文件中查找所有词汇(它从真正的电子书转换而来,所以可能更大,解决方案需要高效(,我将词汇输出到一个名为voclist的文本文件中。但是仍然有一些非法的词我想删除它,例如(aa,aazzz(。

我试过"egrep [a-z]+ voclist"。当然,这是行不通的。

This is the block contain illegal words:
      2 accepting
      2 absence
      1 zz
      1 yyybb
      1 yarn
I want output like this:
      2 accepting
      2 absence
      1 yarn

这个问题我想了很多次。删除"yyybb"并保持"接受"的同时可能有点困难,而"yyybb"在真正的电子书中很少出现,因此我们可以删除"zz"。有人知道吗?

假设inputfile包含:

  2 accepting
  2 absence
  1 zz
  1 yyybb
  1 yarn

要获取包含两个或更多重复字符的单词列表,请执行以下操作:

$ egrep "(w)w*1" inputfile
2 accepting
2 absence
1 zz
1 yyybb

要过滤非法单词,您可以使用字典,例如

$ cat dictionary
accepting
absence

并与它进行比较:

$ egrep "(w)w*1" inputfile | grep -f dictionary
2 accepting
2 absence

你的格式有点不方便。看起来它来自sortuniq -c的组合.为简化起见,我将采用以下输入格式:

accepting
absence
zz
yyybb
yarn

用有点长的方式,你可以写:

 $ grep -v -e '^.$'                           # single char
           -e '^(.)1$'                     # single repeated char (e.g. zzzz)
           -e '(.)1+'                     # repeated char (3 or more times)
           -e '^[aeiou]+$'                   # only vowels
           -e '^[bcdfghjklmnpqrstvwxyz]+$'   # only consonants
           file

我们利用grep,因为它支持匹配部分中的反向引用。 awk 不允许的事情。

现在可以在原始格式上使用它,如下所示:

awk '{print $2}' file 
    | grep -v -e '^.$' -e '^(.)1$' -e '(.)1+'            
              -e '^[aeiou]+$' -e '^[bcdfghjklmnpqrstvwxyz]+$' 
    | grep -wFf - file

最新更新