Tüm metin dosyası için bellek ayırmadan metin dosyasındaki ilk satırı kaldırın

8 Cevap php

Ben çok büyük bir metin dosyası var ve ben tüm yapmanız gereken dosyanın üstünden tek satır kaldırmak olduğunu. İdeal olarak, PHP bitmiş olacaktır, ancak herhangi bir Unix komut iyi çalışır. Ben \ n ulaşana kadar ben sadece dosyanın başında aracılığıyla aktarabilirsiniz düşünüyorum, ama ben bunu nasıl emin değilim.

Thanks, Matt Mueller

8 Cevap

sed -i -e '1d' file ne istediğinizi yapacak.

  • -i "yerinde" belirtir
  • -e "Bu ifadeyi değerlendirmek" anlamına gelir
  • '1d' araçlar, ilk satırı silin

Eğer * nix içinde çeşitli araçlar kullanabilirsiniz. 1,5 milyondan fazla hatları ile bir dosya üzerinde farklı yöntemlerden bazıları karşılaştırılması.

$ 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

Dosya düz ise, kullandığınız sed '1d' file > newfile olabilir

GNU coreutils gelen kuyruk varsayarsak:

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

Pozitif sayı ile kuyruk N-inci satırı ile başlayarak her şeyi verir.

Aşağıdaki komutu deneyin:

sed -n '2,$p' file

Ben dosya ne kadar büyük olduğunu bilmiyorum, ama sen denedin mi awk 'NR > 1' {print}?

Ben perl biraz paslı değilim, ama bu işi olabilir:

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

ve bir filtre olarak bu komut dosyasını kullanabilirsiniz:

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