قم بإزالة السطر الأول في الملف النصي دون تخصيص الذاكرة لملف نصي بأكمله

StackOverflow https://stackoverflow.com/questions/1802757

  •  05-07-2019
  •  | 
  •  

سؤال

لدي ملف نصي كبير جدًا وكل ما أحتاج إلى القيام به هو إزالة سطر واحد من أعلى الملف. من الناحية المثالية ، سيتم ذلك في PHP ، ولكن أي أمر UNIX سيعمل بشكل جيد. أفكر في أنه يمكنني فقط التدفق خلال بداية الملف حتى أصل إلى n ، لكنني لست متأكدًا من كيفية قيامي بذلك.

شكرا ، مات مولر

هل كانت مفيدة؟

المحلول

sed -i -e '1d' file ستفعل ما تريد.

  • -i يشير إلى "في المكان"
  • -e يعني "تقييم هذا التعبير"
  • '1d' يعني ، حذف السطر الأول

نصائح أخرى

يمكنك استخدام مجموعة متنوعة من الأدوات في *nix. مقارنة بين بعض الأساليب المختلفة على ملف بأكثر من 1.5 مليون سطر.

$ 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 > newfile

بافتراض الذيل من GNU CoreUtils:

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

الذيل مع الرقم الإيجابي يخرج كل شيء بدءا من خط n-th.

جرب الأمر التالي:

sed -n '2,$p' file

لا أعرف كم هو ملفك ، لكن هل حاولت awk 'NR > 1' {print} ?

أنا صدئ قليلاً على بيرل ، لكن هذا قد يفعل الخدعة:

#!/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