Как найти те слова, которые повторяют один символ более двух раз в слове (например, «aa, aaxx») - PullRequest
0 голосов
/ 02 апреля 2019

Я хочу найти весь словарь из текстового файла (он конвертируется из настоящей книги, так что, может быть, больше, и решение должно быть эффективным), и я вывел словарь в текстовый файл с именем 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 ]

1 голос
/ 02 апреля 2019

Предположим, 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
0 голосов
/ 02 апреля 2019

Формат у вас немного неудобный. Похоже, что это происходит от комбинации sort и uniq -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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...