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

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

Line 1: abcd
Line 2: efgh
Line 3: ijkl
Line 4: mnop
Line 5: qrst
Line 6: uvwxyz

Из этих шести я хочу случайно удалить, скажем, 3.

Как это сделать? Было бы здорово, если бы в vim было решение, так что его можно применять в разных диапазонах.

5
задан 30 December 2016 в 06:57

4 ответа

Чтобы удалить несколько случайных строк, образующих определенный диапазон в текстовом файле, вот что я сделал:

  • Откройте файл в vim
  • Перейти к началу страницы диапазон, из которого вы хотите удалить несколько случайных строк. В нижней части диапазона должна быть пустая строка
  • Введите следующую команду:

    .,/^\s*$/-1 !sed -e $((9 * $RANDOM / 32267))d
    

. - Отсюда

, / ^ \ s * $ / - 1 - До последней непустой строки

! Sed -e $ ((9 * $ RANDOM / 32267)) d - команда sed для удаления случайной строки

, которая удалит одну строку случайным образом.

Теперь, если вы хотите удалить еще 5 случайных строк, просто сделайте 5 @:, а vim сделает все остальное.

Это может быть улучшено, если я смогу заменить это 9 (количество строк, из которого нужно удалить) некоторым выражением, которое будет универсальным

0
ответ дан 30 December 2016 в 06:57

Вот решение с использованием sed:

sed -i $((start + RANDOM % range))d filename.txt

, где:

  • start - номер начальной строки вашего диапазона
  • range (или end-start - это число строк, которые нужно включить с start )
  • sed -i -Nd сообщает sed удалить строку N во входном файле
  • RANDOM - генератор случайных чисел bash; специальная переменная оболочки, которая содержит случайное целое число от 0 до 32767 при его использовании.

Так, например, чтобы удалить случайную строку между строками 90 и 120 в файле test.txt , вы должны использовать:

sed -i $((90 + RANDOM % 30))d test.txt
0
ответ дан 30 December 2016 в 06:57

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

0
ответ дан 30 December 2016 в 06:57

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

:nd

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

0
ответ дан 30 December 2016 в 06:57

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

Похожие вопросы: