Elimine la primera línea del archivo de texto sin asignar memoria para todo el archivo de texto
-
05-07-2019 - |
Pregunta
Tengo un archivo de texto muy grande y todo lo que necesito hacer es eliminar una sola línea de la parte superior del archivo. Idealmente, se haría en PHP, pero cualquier comando de Unix funcionaría bien. Estoy pensando que puedo transmitir a través del comienzo del archivo hasta llegar a \ n, pero no estoy seguro de cómo hacerlo.
Gracias Matt Mueller
Solución
sed -i -e '1d' file
hará lo que quiera.
-
-i
indica " en el lugar " -
-e
significa " evaluar esta expresión " -
'1d'
significa, eliminar la primera línea
Otros consejos
puede usar una variedad de herramientas en * nix. Una comparación de algunos de los diferentes métodos en un archivo con más de 1.5 millones de líneas.
$ 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
Si su archivo es plano, puede usar sed '1d' file > archivo nuevo
Asumiendo cola de GNU coreutils:
tail -n +2 file > newfile
tail -n +2 < source > destination
La cola con número positivo genera todo lo que comienza con la enésima línea.
Pruebe el siguiente comando:
sed -n '2,$p' file
No sé qué tan grande es su archivo, pero ¿intentó con awk 'NR > 1 '{print}
?
Estoy un poco oxidado en Perl, pero esto podría hacer el truco:
#!/usr/bin/perl
$first = true;
while (<>)
{
if ($first)
{
# skip first line
$first = false;
}
else
{
print;
}
}
y use este script como 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
}