2010-06-10 16 views
13

Tengo un montón de archivos en un directorio y de cada archivo quiero eliminar la primera línea (incluido el retorno de carro). Puedo leer todo el archivo en una serie de cadenas y escribir todo menos el primer elemento en un nuevo archivo, pero eso me parece un poco engorroso ¿hay formas mejores? Oh, el idioma preferido es Perl.Perl: cómo elimino la primera línea de un archivo sin leer ni copiar todo el archivo

+10

Esto es imposible porque cómo se almacenan los archivos. Siempre tendrá que leer todo el archivo y escribir todo menos la primera línea; el sistema operativo no tiene otra opción. – Konerak

Respuesta

23

prueba este revestimiento

perl -pi -e '$_ = "" if ($. == 1);' filename 

lo he usado antes, debería ser todo lo que necesita.

+0

+1 Nunca necesita almacenar más de una línea a la vez. – mob

+0

¿Puedes explicar cómo funciona esto? – FistOfFury

+0

básicamente dice ejecutar perl, analizar en su lugar y ejecutar la siguiente línea de código. La siguiente línea usa la variable predeterminada $ _ que en este caso es la línea leída por la opción -p. ps es el número de línea de nombre de archivo. entonces, si el número de línea es == 1, configure el texto de la línea en "". –

5
use Tie::File qw(); 
for my $filename (glob 'some_where/some_files*') { 
    tie my @file, 'Tie::File', $filename or die "Could not open $filename: $!"; 
    shift @file; 
} 
+0

+1 si solo para su PS. :) –

+1

Tenga en cuenta que esto todavía tiene que leer y copiar todo el archivo, pero eso es inherente al problema. No sé de ningún sistema operativo que proporcione otra forma de eliminar datos desde el comienzo de un archivo. – cjm

+0

Tie :: File es mi opción obvia porque se ha escrito explícitamente para tratar esta categoría de problema exacta de manera eficiente. – daxim

9
perl -n -i -e 'print unless $. == 1' myfile 

Esto es similar a la respuesta de stocherilac.

Pero, en cualquier caso (y en todas las demás respuestas dadas) siempre está leyendo el archivo completo. No hay forma de evitar eso, AFAIK.

+0

+1 para más de una forma de hacerlo :) –

+0

+1 para una versión (más fácil de leer). –

+0

En Windows bajo la consola MinGW, ese borró mi archivo "No se puede editar in situ en myfile: Permiso denegado" – user869097

11

¿Qué tal

tail +2 

con cáscara?

(edit: en Linux más reciente es posible que necesite tail -n +2 (gracias, GNU :()!)

9

Oh el idioma preferido es Perl

veces sed es mejor que sed. incluso perl:

sed -i 1d * 
-1

como ha señalado Schwern, la siguiente no no realizar una salida temprana como había pensado en un principio que lo haría:

perl -pi -e '$_ = q// and last if $. == 1;' myFile 

parece que uno no puede evitará el tratamiento de todo el archivo después de todo.

+4

Esto no hace lo que usted cree que hace. Si lo hiciera, violaría cómo funcionan los archivos en Unix. Lo que realmente está sucediendo es '$ _ =" "' siempre es falso, por lo que '$ _ =" "y last' es lo mismo que' 0 y last'.Se cortocircuita y nunca llama '' último ''. Usted ha escrito: 'perl -pi e '$ _ = q // si $. == 1 'myFile', que es una manera inteligente de no imprimir la primera línea, pero definitivamente lee todo el archivo. Ejecutar con '-MO = Deparse' para obtener el código y ejecutarlo en el depurador para ver. 'haz {esto; ese; } si algo' es una construcción más segura. – Schwern

+0

@Schwern: Mi mal. Tu explicación tardó un poco, pero entiendo tu punto. – Zaid

Cuestiones relacionadas