Как я удаляю определенные строки (использующий номера строки) в файле?

В Солярисе команда, в которой Вы нуждались бы:

prstat -a -s size

Это перечислит все процессы в порядке убывающего размера образа процесса. Обратите внимание, что последний основан на памяти, согласился на процесс ОС, не ее резидентное использование физической памяти.

Существуют, предположительно, версии "вершины", доступной для Соляриса, но это не часть стандартной установки.

27
10.01.2013, 12:05
4 ответа

С sed, как так:

sed '20,37d; 45d' < input.txt > output.txt

Если Вы хотели сделать это оперативное:

sed --in-place '20,37d; 45d' file.txt
29
27.01.2020, 19:39
  • 1
    Существует ли способ сделать его оперативный? –  tshepang 13.04.2011, 00:02
  • 2
    я предлагаю sed-i файл –  enzotib 13.04.2011, 00:24
  • 3
    @Tshepang: Использовать ed, или GNU sed -i, или sponge, или большой метод файла. –  Gilles 'SO- stop being evil' 13.04.2011, 01:00
  • 4
    я часто задавался вопросом о возможно вводящем в заблуждение оперативном термине при обращении к 'sed', таким образом, я искал его в 'человеке sed': - оперативный [=SUFFIX] This option specifies that files are to be edited in-place. GNU sed' делает это путем создания временного файла и отправки произвело в этот файл, а не в стандартный вывод'.... Я не знаю ни о каком другом 'sed', но логистика обновления "на месте" с потоковым редактором не "вычисляют" :) –  Peter.O 13.04.2011, 17:36
  • 5
    Большинство "оперативных" методов использует временный файл, по моему опыту. –  Faheem Mitha 14.04.2011, 13:08

Просто считайте его в память, измените его, затем запишите его обратно. Можно сделать что-то как

filename = "foo"
f = open(filename, 'r+')                                                                                                                                 
linenums = [1, 3]                                                                                                                                            
s = [y for x, y in enumerate(f) if x not in [line-1 for line in linenums]]                                                                                                                                          
f.seek(0)
f.write(''.join(s))
f.truncate(f.tell())
f.close()

Протестированный с 5 файлами строки. Кредиты на http://pleac.sourceforge.net/pleac_python/fileaccess.html, посмотрите раздел "Modifying a File in Place Without a Temporary File". См. также https://stackoverflow.com/questions/125703/how-do-i-modify-a-text-file-in-python

Некоторые примечания:

  1. Можно было сначала усечь файл, затем записать в него, вместо того, чтобы записать, затем усечь, как выше. Однако я не знаю о флаге Python, который позволяет читать и затем делает усеченную запись. Но возможно я пропускаю что-то, поскольку документ не, все настолько очищается. Который приносит мне к

  2. Иногда документы Python действительно сосут. См. http://docs.python.org/library/functions.html#open

    Режимы 'r +', 'w +' и '+' открывают файл для обновления (отмечают, что 'w +' усекает файл).

    Это значит что-нибудь для Вас? Что, черт возьми, "открыто для обновления"?

  3. Я не знаю при выполнении этого в Python в противоположность чему-то, что unixy как потоковый редактор лучше. Это могло бы быть более портативно, но я не знаю, как портативный sed. Я просто записал это как этот, потому что я более доволен низкоуровневым программированием, чем использование классических инструментов Unix, которые хороши, если они делают точно, что Вы хотите, но (я думаю), обычно менее гибки.

  4. Этот подход (управляющий файлом в памяти) обменивает память на дисковое пространство. Это должно работать хорошо над машинами с некоторыми Гбит памяти для файлов до нескольких сотен Мбит. Python не обрабатывает строки очень эффективно, таким образом переключение на C/C++, например, немного увеличило бы производительность и значительно уменьшило бы использование памяти.

1
27.01.2020, 19:39

Если файл удобно помещается в память, можно также использовать ed .
Команды достаточно похожи на вышеприведенную sed с одним заметным отличием : необходимо передать список номеров/диапазонов строк, которые необходимо удалить в порядке убывания (от наибольшего no/диапазона до наименьшего). Причина в том, что когда вы удаляете/вставляете/сплевываете/соединяете строки с помощью ed, текстовый буфер обновляется после каждой подкоманды, поэтому если вы удалите несколько строк, то остальные следующие строки больше не будут находиться в буфере на той же позиции, что и при выполнении следующей подкоманды. Поэтому нужно начинать заново1.
Редактирование на месте:

ed -s in_file <<IN
45d
20,37d
w
q
IN

или

ed -s in_file <<< $'45d\n20,37d\nw\nq\n'

или

printf '%s\n' 45d 20,37d w q | ed -s in_file

Замените write на ,print, если вы хотите распечатать полученный результат вместо записи в файл. Если вы хотите сохранить исходный файл и записать его в другой файл, вы можете передать новое имя файла в подкоманду write:

ed -s in_file <<IN
78,86d
65d
51d
20,37d
w out_file
q
IN

1. Если только вы не хотите вычислить новые номера строк после каждой delete, что довольно тривиально для данного случая (после удаления строк 20-37, т.е. 18 строк, строка 45 становится строкой 27), то вы можете запустить:

ed -s in_file <<IN
20,37d
27d
w
q
IN

Однако, если вам нужно удалить несколько номеров строк/диапазонов, то работа в обратном направлении - это бессмыслица.

5
27.01.2020, 19:39

Вы можете использовать Vim в режиме Ex:

ex -sc '20,37d|45d|x' file
  1. d удалить

  2. x сохранить и закрыть

0
27.01.2020, 19:39

Теги

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