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

时间:2019-04-02 02:30:47

标签: bash grep

我想从文本文件中找到所有词汇表(它是从真正的电子书转换而来的,所以可能更大,解决方案需要有效),并且我已经在名为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”。有人有什么主意吗?

2 个答案:

答案 0 :(得分:1)

假设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

答案 1 :(得分:0)

您使用的格式有点麻烦。看起来它来自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