我有一个非常大的文本文件,我需要做的就是从文件顶部删除一行。理想情况下,它将在PHP中完成,但任何unix命令都可以正常工作。我想我可以直接浏览文件的开头直到我到达\ n,但我不确定我是怎么做的。
谢谢, 马特穆勒
答案 0 :(得分: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 :(得分:3)
sed -i -e '1d' file
会做你想做的事。
-i
表示“就地”-e
表示“评估此表达式”'1d'
表示删除第一行答案 2 :(得分:1)
如果您的文件是平的,可以使用sed '1d' file > newfile
答案 3 :(得分:1)
尝试以下命令:
sed -n '2,$p' file
答案 4 :(得分:1)
假设来自GNU coreutils的尾巴:
tail -n +2 file > newfile
答案 5 :(得分:1)
tail -n +2 < source > destination
带正数的尾部输出从第N行开始的所有内容。
答案 6 :(得分:0)
我不知道你的文件有多大,但是你试过awk 'NR > 1' {print}
吗?
答案 7 :(得分: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
答案 8 :(得分: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
}