Rimuovere la prima riga nel file di testo senza allocare memoria per l'intero file di testo
-
05-07-2019 - |
Domanda
Ho un file di testo molto grande e tutto quello che devo fare è rimuovere una singola riga dalla parte superiore del file. Idealmente, sarebbe fatto in PHP, ma qualsiasi comando unix funzionerebbe bene. Sto pensando di poter semplicemente eseguire lo streaming all'inizio del file fino a raggiungere \ n, ma non sono sicuro di come lo faccio.
Grazie, Matt Mueller
Soluzione
sed -i -e '1d' file
farà quello che vuoi.
-
-i
indica " sul posto " -
-e
significa " valuta questa espressione " -
'1d'
significa, eliminare la prima riga
Altri suggerimenti
puoi usare una varietà di strumenti in * nix. Un confronto di alcuni dei diversi metodi su un file con oltre 1,5 milioni di righe.
$ 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
Se il tuo file è piatto, puoi usare file sed '1d' > newfile
Supponendo la coda dai coreutils GNU:
tail -n +2 file > newfile
tail -n +2 < source > destination
La coda con un numero positivo emette tutto a partire dalla linea N-esima.
Prova il seguente comando:
sed -n '2,$p' file
Non so quanto sia grande il tuo file, ma hai provato awk 'NR > 1 '{stampa}
?
Sono un po 'arrugginito su perl, ma questo potrebbe fare il trucco:
#!/usr/bin/perl
$first = true;
while (<>)
{
if ($first)
{
# skip first line
$first = false;
}
else
{
print;
}
}
e usa questo script come filtro:
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
}