У меня есть текстовый файл, и я хочу удалить случайные строки из диапазона. Вот пример:
Line 1: abcd
Line 2: efgh
Line 3: ijkl
Line 4: mnop
Line 5: qrst
Line 6: uvwxyz
Из этих шести я хочу случайно удалить, скажем, 3.
Как это сделать? Было бы здорово, если бы в vim было решение, так что его можно применять в разных диапазонах.
Чтобы удалить несколько случайных строк, образующих определенный диапазон в текстовом файле, вот что я сделал:
Введите следующую команду:
.,/^\s*$/-1 !sed -e $((9 * $RANDOM / 32267))d
. - Отсюда
, / ^ \ s * $ / - 1 - До последней непустой строки
! Sed -e $ ((9 * $ RANDOM / 32267)) d - команда sed для удаления случайной строки
, которая удалит одну строку случайным образом.
Теперь, если вы хотите удалить еще 5 случайных строк, просто сделайте 5 @:, а vim сделает все остальное.
Это может быть улучшено, если я смогу заменить это 9 (количество строк, из которого нужно удалить) некоторым выражением, которое будет универсальным
Вот решение с использованием sed
:
sed -i $((start + RANDOM % range))d filename.txt
, где:
sed -i -Nd
сообщает sed удалить строку N во входном файле RANDOM
- генератор случайных чисел bash; специальная переменная оболочки, которая содержит случайное целое число от 0 до 32767 при его использовании. Так, например, чтобы удалить случайную строку между строками 90 и 120 в файле test.txt , вы должны использовать:
sed -i $((90 + RANDOM % 30))d test.txt
Это возможно и с python
:
bash-4.3$ python -c 'import sys,random;lines=sys.stdin.readlines();lines.pop(random.randint(0,len(lines)-1));print "".join(lines)' < input.txt
Line 1: abcd
Line 2: efgh
Line 3: ijkl
Line 5: qrst
Line 6: uvwxyz
Процесс здесь прост, мы перенаправляем входной файл в python stdin
и читаем все строки в список. Затем мы выбираем случайный индекс строки с помощью функции random.randint()
в диапазоне всех индексов в списке, от индекса 0 до последнего индекса (это то, что делает len(lines)-1
). Этот индекс удаляется из списка через lines.pop()
, и затем мы печатаем заново собранный текст. Довольно просто
Используйте следующую команду
:nd
, где n - номер строки.