Как удалить случайную строку в текстовом файле из заданного диапазона?

У меня есть текстовый файл, и я хочу удалить случайные строки из диапазона. Вот пример:

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 (количество строк, из которых нужно удалить) некоторым выражением, которое будет универсальным

Используйте следующую команду

:nd

где n - номер строки.

Можно с 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(), а затем мы печатаем заново собранный текст. Достаточно просто

Другие вопросы по тегам