不分配内存的情况下删除文本文件中的第一行

4
我有一个非常大的文本文件,我只需要从文件顶部删除一行。最好使用PHP完成,但任何Unix命令都可以。我想我可以通过流式传输文件开头,直到达到\n,但我不确定该如何实现。
谢谢, Matt Mueller
9个回答

6

您可以在*nix中使用各种工具。比较一下在包含超过150万行的文件上使用不同方法的结果。

$ 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

各种解决方案的时间都很准确,它们都比这里的其他建议更加优雅。+1 - I82Much

3

sed -i -e '1d' file可以达到你想要的效果。

  • -i表示“原地修改”
  • -e表示“评估此表达式”
  • '1d'表示删除第一行

“删除”操作代价高昂,为什么不直接从第二行开始打印呢? - ghostdog74

1
如果您的文件是平面的,您可以使用 sed '1d' file > newfile

1

请尝试以下命令:

sed -n '2,$p' file

并且使用 -i 参数替换原始文件内容 - Martin

1
假设使用GNU coreutils中的tail命令:
tail -n +2 file > newfile

1
tail -n +2 < source > destination

带有正数的尾部输出从第N行开始的所有内容。


取决于系统和tail的版本。 - Martin

0

我对Perl有点生疏,但这可能会起作用:

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

并使用此脚本作为过滤器:

cat myfile.txt | removefirstline.pl > myfile_2.txt

这可能有些过度了,因为它可以使用基本的Unix文本操作工具完成 ;)。 - Conrad Meyer
1
这并不过分。Perl只是完成工作的另一种工具。 perl -ne 'print if $. > 1' file - ghostdog74

0
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

我不知道你的文件有多大,但你尝试过 awk 'NR > 1' {print} 吗?


awk 对于这项工作来说过于庞大了。如果他想要定期执行此操作(脚本化),awk 并不是一个“好”的解决方案。 - Martin
@Martin,请解释一下“太大的加农炮”。awk是*nix中最快的文件处理工具之一。如果你什么都不知道,请不要发表评论。 - ghostdog74
在这方面,awk和sed有什么区别? - abyx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接