У меня вопрос, похожий на мой предыдущий вопрос, но немного отличается
, что у вас есть 10 столбцов в каждой строке и 100000 строк, я хочу проверить, есть ли каждая строка для следующих шаблонов: [ ! d2]
Если строка выглядит так, я хочу удалить ее
lambda a, b, c, d: a==a and a+1==b and b+1==c and c+1==d and d+1==e
. Хотя это решение отлично работает, все решения работали, все следовали одной и той же логике. Проблема состоит в том, что, скажем, у меня есть 10 строк. Это решение удаляет строки с 5 последовательными номерами, начиная с a до e,
. Если последовательность начинается с b до f, она останется
[d6 ] Я хочу решение, которое управляется циклом, поэтому мне не нужно будет добавлять и удалять переменныеЯ имею в виду, что я хочу удалить все последовательности больше 3, в строке, [!d7 ]
Я имею в виду, что если в строке есть 3 последовательных числа, a==a and a+1==b and b+1==c оставляют их, если есть более трех последовательных номеров a==a and a+1==b and b+1==c and c+1==d and so on, тогда удалите их, где бы они ни возникали.
Я имею в виду, что это может быть
a==a and a+1==b and b+1==c and c+1==d
a==a and a+1==a and b+1==c and c+1==d and d+1==e and e+1==f
and so on
Поэтому я бы предпочел сделать это в цикле или аналогичном решении, поэтому мне не нужно писать все возможности [!d10 ]
Как и в прошлый раз, я бы предпочел awk или perl для учебных целей, мне сказал друг, что haskell может сделать это легко, но я не нашел решение в haskell, если это правда, тогда мне любопытно знать.
Обратите внимание, что я не против рекурсивных решений. Я отредактирую свой вопрос, чтобы дать пример ввода и вывода за несколько часов, когда я вернусь домой
EDIT
пример ввода
1,2,3,4,5,6,7,8,9
1,5,8,11,14,16,17,18,19
1,2,3,5,7,9,15,29,34
11,22,25,30,40,55,80,83,90
ожидаемый вывод [ ! d16]
1,2,3,5,7,9,15,29,34
11,22,25,30,40,55,80,83,90
Причина: третья строка содержит только 3 последовательных номера, четвертая строка, не содержит последовательных чисел. первые две строки должны быть удалены.
Perl: (после повторного добавления примеров к вопросу)
из командной строки:
perl -F, -ane'my($a,$b)=$F[0];$b=$b>($l=$a++==$_?$l+1:0)?$b:$l for@F;print if $b>5' \
file.txt
, если вы хотите изменить файл, используйте кнопку -i флаг для версии командной строки или использовать оператор перенаправления вашей оболочки (>, не используйте его в том же файле, потому что он будет усечен до того, как он будет прочитан!).