У меня есть вопрос, подобный моему более раннему вопросу, но немного отличающийся
скажите, что у Вас есть 10 столбцов на каждой строке и 100 000 строк, я хочу проверить если каждая строка на следующие шаблоны:
Если строка похожа на это, я хочу удалить ее
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 последовательных чисел, запускающихся от до e,
Если последовательность запустится от b до f, то это останется
Я хочу решение, которым управляет цикл, таким образом, я не должен буду продолжать добавлять и удалять переменные
Я подразумеваю, что хочу удалить все последовательности, больше, чем 3 в строке,
Я подразумеваю это, если существует 3 последовательных числа в строке, a==a and a+1==b and b+1==c
оставьте их, если существует больше чем 3 последовательных числа 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
Таким образом, я быть бы, чтобы сделать это в цикле или аналогичном решении, таким образом, я не должен писать все возможности
Как прошлый раз, я предпочел бы awk или жемчуг для изучения целей, мне сказал друг, что haskell может сделать это легко, но я не нашел решение в haskell, если это правда затем мне любопытно знать как.
Обратите внимание на то, что я не возражаю против рекурсивных решений. Я отредактирую свой вопрос дать входной и выходной пример через несколько часов, когда я возвращусь домой
Править
пример вводится
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
ожидаемый вывод
1,2,3,5,7,9,15,29,34
11,22,25,30,40,55,80,83,90
Причина: третья строка, содержит только 3 последовательных числа, четвертую строку, не содержит последовательных чисел. сначала две строки должны быть удалены.
протестированный:
awk -F, '{
for (i=1; i<=NF-3; i++)
if ($i+1==$(i+1) && $i+2==$(i+2) && $i+3==$(i+3))
next
print
}' file
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
флаг для версии командной строки или использование оператор перенаправления Вашей оболочки (>
, не используйте его на том же файле, потому что это будет усеченным, прежде чем это будет считано!).