Как удалить случайную строку в текстовом файле из заданного диапазона?
У меня есть текстовый файл, и я хочу удалить случайные строки из диапазона. Вот пример:
Line 1: abcd
Line 2: efgh
Line 3: ijkl
Line 4: mnop
Line 5: qrst
Line 6: uvwxyz
Из этих шести я хочу случайно удалить, скажем, 3.
Как это сделать? Было бы здорово, если бы в vim было решение, чтобы его можно было применять в разных диапазонах.
4 ответа
Вот решение с использованием sed:
sed -i $ ((start + RANDOM% range)) d filename.txt
где:
- start - номер начальной строки вашего диапазона
- диапазон (или конец-начало - это количество строк, включаемых в начало)
sed -i -Ndговорит sed удалить строку N во входном файлеRANDOMгенератор случайных чисел bash; специальная переменная оболочки, которая содержит случайное целое число от 0 до 32767 при ее использовании.
Так, например, чтобы удалить случайную строку между строками 90 и 120 в файле test.txt, вы должны использовать:
sed -i $ ((90 + RANDOM% 30)) d test.txt
Чтобы удалить несколько случайных строк, сформируйте определенный диапазон в текстовом файле, вот что я сделал:
- Откройте файл в VIM
- Перейдите в верхнюю часть диапазона, откуда вы хотите удалить несколько случайных строк. Диапазон должен иметь пустую строку внизу
Введите следующую команду:
.,/^\s*$/-1 !sed -e $((9 * $RANDOM / 32267))d
, - Отсюда
,/^\s*$/-1 - до последней непустой строки
!sed -e $((9 * $RANDOM / 32267))d - команда sed для удаления случайной строки
Это удалит одну строку наугад.
Теперь, если вы хотите удалить еще 5 случайных строк, просто сделайте 5@: и vim сделает все остальное.
Это может быть улучшено, если я смогу заменить 9 (количество строк, из которых нужно удалить) некоторым выражением, которое будет универсальным
Можно с 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(), а затем мы печатаем заново собранный текст. Достаточно просто