我有一个非常大的文本文件,我所需要做的就是从文件顶部删除一行。理想情况下,它可以在 PHP 中完成,但任何 UNIX 命令都可以正常工作。我想我可以直接流过文件的开头,直到到达 ,但我不确定如何做到这一点。

谢谢,马特·穆勒

有帮助吗?

解决方案

sed -i -e '1d' file 会做你想做的事。

  • -i 表示“就地”
  • -e 意思是“评估这个表达式”
  • '1d' 意思是,删除第一行

其他提示

你可以在* 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

如果您的文件是平的,您可以使用 sed'1d'文件&gt; newfile中

假设来自GNU coreutils的尾巴:

tail -n +2 file > newfile
tail -n +2 < source > destination

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

尝试以下命令:

sed -n '2,$p' file

我不知道你的文件有多大,但是你尝试了 awk'NR&gt; 1'{print}

我对perl有点生疏,但这可能就是这个伎俩:

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

并将此脚本用作过滤器:

cat myfile.txt | removefirstline.pl > myfile_2.txt
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
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top