Печатать только те строки, которые содержат три последовательных числа - PullRequest
0 голосов
/ 24 октября 2018

Я фильтрую текстовый файл с номерами и именами. Я хочу напечатать только те строки, которые содержат наборы из трех последовательных цифр подряд.Список ввода:

123 321 567 765 124 5689 12345.

Вывод должен содержать:

123 321 567 765 12345

Я пробовал эту команду

awk ' {split ("", N) # delete array N 
L = 1 # initialize boolean L to TRUE
for (i=1; i<=length($1); i++){ # for each digit
    P = substr($1, i, 1) 
    if (N[P-1] || N[P+1]){ # if contiguous digit exists, 
        L = 0 break # set L to FALSE; and quit the for loop 
    } N[P] = 1 } } L ' file 

, но она не работает должным образом.

Мне нравится любая команда sed или grep или awk для работы.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Это базовое регулярное выражение для 3 последовательных (восходящих или нисходящих) чисел.

(?:012|123|234|345|456|567|678|789)|(?:987|876|765|654|543|432|321|210)

https://regex101.com/r/hd5PzR/1

Вы можете украсить его при необходимости \d*(?:(?:012|123|234|345|456|567|678|789)|(?:987|876|765|654|543|432|321|210))\d*
.

https://regex101.com/r/hd5PzR/2

0 голосов
/ 25 октября 2018

Вы ищете помощь в выполнении домашних заданий или пытаетесь решить проблему?Если последнее имеет место, использование алгоритмического подхода, когда комбинаций так мало, похоже на использование цепной пилы для резки масла.Рассмотрим следующий сценарий:

mystring="012 123 234 567 678 789"
revstring=$(echo $mystring|rev)
checkstring="$mystring $revstring"

for checkno in $(echo $checkstring);
do
        grep $checkno numbers
done

Обратите внимание, что это даст вам дублированный вывод для строк, содержащих более одной последовательности, но просто запустите это через | sort -u, чтобы устранить их.

...