powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / файл без последних строк
3 сообщений из 28, страница 2 из 2
файл без последних строк
    #36569157
Gradient
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На многогигабайтных не тестировал. Не очень советую: тут вывод идёт на stdout, то есть в консоль. Так что вывода даже мегабайтного ждать будете о-о-чень долго. Так что пока не представляю, зачем это нужно.

Другое дело - после этого дела использовать ">outfile" тогда не сильно медленнее приведённого в старт.топике способа должно быть (увы, питон медленнее предложенного С - всё-таки интерпретируемый скрипт. Зато конструкции проще и грамотней.)

Вообще должно работать нормально и не особо медленно: чтение из файла буферизированное, три строки прочитал - вывел, весь файл в память не засасывается. В общем - по-любому не самый плохой вариант. Imho. Но лучше - да, наверное, можно.
...
Рейтинг: 0 / 0
файл без последних строк
    #36572762
PA3YM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Karbafosperl на то и perl, чтобы не только целиком в память засасывать.
кто мешает с конца блоками читать и проверять на \n
+1. Отсчитать от конца файла ненужные строки, запомнить смещение, а потом sysread+syswrite блоками по X мегабайт от начала файла до смещения - на гигабайтных файлах с построчным чтением не сравнить.
...
Рейтинг: 0 / 0
файл без последних строк
    #36572824
PA3YM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну где-то так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
#!/usr/bin/perl
$nlskip=$ARGV[ 0 ]; # number of lines skipped
$ifn=$ARGV[ 1 ]; # input file name
$ofn=$ARGV[ 2 ]; # output file name
$maxlinesize= 256 ; # expected maximum line length
$chunksize= 1024 * 1024 ; # chunk size for read/write operations
$filesize=(stat($ifn))[ 7 ];
$tailoffset=$nlskip*$maxlinesize;
$tailoffset=$filesize if $tailoffset>$filesize;
open(IFN,"<$ifn")||die("Can't open source file $ifn");
seek(IFN,$filesize-$tailoffset,0);
sysread(IFN,$buffer,$tailoffset);
for($n=$tailoffset-1;$n>0;$n--){
    if(substr($buffer,$n,1) eq "\n"){
	if(--$nlskip<0){
	    $lastoffset=$filesize-($tailoffset-$n);
	    seek(IFN,0,0);
	    open(OFN,">$ofn")||die("Can't create target file $ofn");
	    for($offset= 0 ;;){
		$nread=$lastoffset-$offset;
		$nread=$chunksize if $nread>$chunksize;
		sysread(IFN,$buffer,$nread);
		syswrite(OFN,$buffer);
		$offset+=$nread;
		exit  0   if $nread<$chunksize;
	    }
	}
    }
}
...
Рейтинг: 0 / 0
3 сообщений из 28, страница 2 из 2
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / файл без последних строк
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]