LINUX.ORG.RU

Выборка нужных строк grep

 


0

1

Как сделать выборку ?

Нужно что то типа grep

Только что бы вывод строк происходил если в строке встречаются одновременно все блоки из цифр

00 11 22 33 44 55 66 77 88 99

Независимо от их порядка в строке

Цифры в ряду могут быть расположены по разному

99 55 33 00 77 44 66 11 88 22

Вот пример файла со строками

10110000
11004488
67993344
22662266
11111111
22225555
33331111
88885555
90011111
55005500
22773366
60345588
10109901
74339955
54850099
77441188
43887544

Нужно что бы на выходе получились строки которые содержат в себе все блоки из цифр 00 11 22 33 44 55 66 77 88 99

Вот такое должно быть на выходе

11111111
22225555
33331111
55005500
22773366
77441188



Последнее исправление: DataLife (всего исправлений: 4)

Нужно что бы на выходе получились строки которые содержат в себе все блоки из цифр 00 11 22 33 44 55 66 77 88 99

Вот такое должно быть на выходе

Но ведь в этом примере ни в одной строке нет всех этих блоков. В 22225555 вообще только 22 и 55, но нет 00 11 33 и т.д.

Сформулируй более чётко, что требуется-то.

Хотя бы одна повторяющаяся подряд цифра в строке?

P.S. Код (содержимое файла, вывод) оформи так: три backtick’а на отдельной строке, потом код, и снова три backticka. Вот так:

Содержимое файла:

```
11
12466
sorok tysyach obezyan
```

Получится:

11
12466
sorok tysyach obezyan

Подробнее: https://www.linux.org.ru/help/markdown.md

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 2)
Ответ на: комментарий от DataLife

Нужно что бы на выходе получились строки которые содержат в себе все блоки из цифр

Как раз и состоит из двух блоков цифр 22 и двух 55

Определитесь — надо чтоб содержало все или содержало два. И надо ровно два, или два и более? Или даже если один есть, то норм?

Или надо просто чтоб каждая цифра была парной?

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)

Challenge accepted

$ perl -ne '(/^\d+$/ && !grep {!/(\d)\1/} (m/../g)) && print' numbers.txt
11004488
22662266
11111111
22225555
33331111
88885555
55005500
22773366
77441188

Пояснение: (\d)\1 матчит пары одинаковых цифр подряд

annulen ★★★★★
()
Последнее исправление: annulen (всего исправлений: 2)
Ответ на: комментарий от DataLife

Нужно что бы выводились все строки в которых одновременно есть значения

00 11 22 33 44 55 66 77 88 99

Независимо от их порядка в этих строках

Все строки которые выглядят так
22557788
00000000
44112288
77887799
22222222
33337777
99999999
11111111
55555555

А остальные строки типа

12348899
66519988
37554433
88335569
76887722

Отбрасывались

DataLife
() автор топика
Ответ на: комментарий от DataLife

В строке 22557788 одновременно нет значений «00 11 22 33 44 55 66 77 88 99». Только «22 55 77 88» — нет «00 11 33 44 66 99».

При этом если надо не все, то почему 12348899 отбрасывается? Ведь в нём тоже есть «88 99».

Сколько надо чтоб было?

Или надо просто чтобы не было непарных цифр?

Я правильно понял, что надо, чтобы строка состояла только из двойных цифр и ничего больше, в этом суть?

Ну тогда всё просто: grep -E '^(00|11|22|33|44|55|66|77|88|99)+$'

cat testfile 
10110000
11004488
67993344
22662266
11111111
22225555
33331111
88885555
90011111
55005500
22773366
60345588
10109901
74339955
54850099
77441188
43887544

grep -E '^(00|11|22|33|44|55|66|77|88|99)+$' testfile
11004488
22662266
11111111
22225555
33331111
88885555
55005500
22773366
77441188

grep -Ev '^(00|11|22|33|44|55|66|77|88|99)+$' testfile
10110000
67993344
90011111
60345588
10109901
74339955
54850099
43887544

Так надо? Или не так опять?

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 4)
Ответ на: комментарий от DataLife

все строки в которых одновременно есть значения

Если ты осилишь написать нормальное текстовое условие, ты его можешь буквально перевести в регулярку, не такую краткую как у @annulen, но вполне рабочую)

goingUp ★★★★★
()
Ответ на: комментарий от goingUp

Не, у меня императивный код. Если то, что хочет сделать ТС, и можно выразить одной регуляркой, то мне кажется, что получится адилище.

annulen ★★★★★
()
Последнее исправление: annulen (всего исправлений: 1)
Ответ на: комментарий от annulen

Это супер!!
Очень круто!!!

То что нужно

А как сделать тоже самое с парами или блоками из трёх цифр

000 111 222 333 444 555 666 777 888 999

Что бы из
123777111
432666777
444556888
555888111
222111999
111777333
888444111
563333777
777333888

Остались только
555888111
222111999
111777333
777333888

DataLife
() автор топика
Ответ на: комментарий от CrX

Не то, на выходе вылазит все если есть хотя бы одно из совпадений

000 111 222 333 444 555 666 777 888 999

Все строки в которых встречается хоть одно из значений
000 111 222 333 444 555 666 777 888 999

То есть на выходе такие строки
111212049
111212040
111212050
111212055
222655666

DataLife
() автор топика
Ответ на: комментарий от DataLife

Ой тфу, без v, конечно. grep -E '^(000|111|222|333|444|555|666|777|888|999)+$'.

-v это не где есть хотя бы одно из значений, а все строки, которые не соответствуют реглярке.

Всё аналогично с решением выще для двух цифр.

CrX ★★★★★
()
Ответ на: комментарий от DataLife

Обобщение для блоков из N чисел:

N=2 perl -ne '/^((\d)\2{$ENV{N}})+$/ && print' numbers.txt

Обобщение для блоков произвольной длины от 2 и выше:

perl -ne '/^((\d)\2{1,})+$/ && print' numbers.txt
annulen ★★★★★
()
Последнее исправление: annulen (всего исправлений: 1)