テキストファイル全体にメモリを割り当てずに、テキストファイルの最初の行を削除する
-
05-07-2019 - |
質問
非常に大きなテキストファイルがあり、ファイルの先頭から1行削除するだけです。理想的には、PHPで行われますが、どのUNIXコマンドでも問題なく機能します。 \ nに達するまでファイルの先頭からストリーミングできると思っていますが、どうすればいいのかわかりません。
ありがとう、 マットミュラー
解決
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' file&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
}
所属していません StackOverflow