Удалить первую строку в текстовом файле без выделения памяти для всего текстового файла - PullRequest
4 голосов
/ 26 ноября 2009

У меня очень большой текстовый файл, и все, что мне нужно сделать, это удалить одну единственную строку из верхней части файла.В идеале это будет сделано в PHP, но любая команда unix будет работать нормально.Я думаю, что могу просто просмотреть начало файла, пока не достигну \ n, но я не уверен, как мне это сделать.

Спасибо, Мэтт Мюллер

Ответы [ 9 ]

6 голосов
/ 26 ноября 2009

вы можете использовать различные инструменты в * nix. Сравнение некоторых различных методов в файле с более чем 1,5 миллионами строк.

$ wc -l < file4
1700589

$ time sed -n '2,$p' file4 > /dev/null

real    0m2.538s
user    0m1.787s
sys     0m0.282s

$ time awk 'NR>1' file4 > /dev/null

real    0m2.174s
user    0m1.706s
sys     0m0.293s

$ time tail -n +2 file4 >/dev/null

real    0m0.264s
user    0m0.067s
sys     0m0.194s

$time  more +2 file4 > /dev/null

real    0m11.771s
user    0m11.131s
sys     0m0.225s

$ time perl -ne 'print if $. > 1' file4 >/dev/null

real    0m3.592s
user    0m3.259s
sys     0m0.321s
3 голосов
/ 26 ноября 2009

sed -i -e '1d' file будет делать то, что вы хотите.

  • -i обозначает «на месте»
  • -e означает «оценить это выражение»
  • '1d' означает, удалить первую строку
1 голос
/ 26 ноября 2009
tail -n +2 < source > destination

Хвост с положительным числом выводит все, начиная с N-й строки.

1 голос
/ 26 ноября 2009

Принимая хвост от GNU coreutils:

tail -n +2 file > newfile
1 голос
/ 26 ноября 2009

Попробуйте следующую команду:

sed -n '2,$p' file
1 голос
/ 26 ноября 2009

Если ваш файл плоский, вы можете использовать sed '1d' file > newfile

0 голосов
/ 26 ноября 2009
function cutline($filename,$line_no=-1) {

$strip_return=FALSE;

$data=file($filename);
$pipe=fopen($filename,'w');
$size=count($data);

if($line_no==-1) $skip=$size-1;
else $skip=$line_no-1;

for($line=0;$line<$size;$line++)
if($line!=$skip)
fputs($pipe,$data[$line]);
else
$strip_return=TRUE;

return $strip_return;
}

cutline('foo.txt',1); // deletes line 1 in foo.txt
}
0 голосов
/ 26 ноября 2009

Я немного заржавел на Perl, но это может сработать:

#!/usr/bin/perl
$first = true;
while (<>)
{
    if ($first)
    {
        # skip first line
        $first = false;
    }
    else
    {
        print;
    }
}

и использовать этот скрипт в качестве фильтра:

cat myfile.txt | removefirstline.pl > myfile_2.txt
0 голосов
/ 26 ноября 2009

Я не знаю, насколько велик твой файл, но ты пробовал awk 'NR > 1' {print}?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...