Совпадение строк с определенным количеством уникальных символов в bash - PullRequest
2 голосов
/ 05 марта 2020

Мне нужно удалить все строки в файле, которые содержат менее 4 уникальных символов

Ввод:

hello
cabby
pabba
lokka
lappa
coool
apple

Ожидаемый вывод:

hello
cabby
lokka
apple

Я пытался придумать регулярное выражение, чтобы сделать это, но я не могу думать, как это вообще возможно. Я нашел команду sed, которая выглядит многообещающей, она удаляет все повторяющиеся символы. Однако я не уверен, как запрограммировать sed, чтобы проверить, возвращает ли программа 4 символа, а затем, если это так, совпадает с исходной строкой. sed ':1;s/\(\(.\).*\)\2/\1/g;t'

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Использование gnu awk:

awk 'BEGIN{FS=""} {
unq=0; delete seen; for (i=1; i<=NF; i++) if (!seen[$i]++) unq++} unq > 3' file

hello
cabby
lokka
apple

FS="" разбивает каждый символ на отдельное поле в awk.

0 голосов
/ 06 марта 2020

Вы пробовали sed ':1;s/\(\(.\).*\)\2/\1/g;t', пожалуйста, замените t на t1.
Перед вашей командой скопируйте текущую строку в поле Hold.
После вашей команды замените строки не менее чем с 4 символами. с исходной строкой.
Теперь убедитесь, что вы печатаете только строки длиной не менее четырех символов.

echo 'hello
cabby
pabba
lokka
lappa
coool
apple' | sed -nE 'h;:1;s/(.)(.*)\1/\1\2/g;t1;/.{4}/x;/.{4}/p'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...