shell - primeras - extraer una linea de un archivo en linux
¿Cómo limito(o trunco) el archivo de texto por número de líneas? (2)
Truncamiento en el lugar
Para truncar el archivo in situ con sed, puede hacer lo siguiente:
sed -i ''50001,$ d'' filename
-
-i
significa en su lugar. -
d
significa eliminar. -
50001,$
significa las líneas desde 50001 hasta el final.
Puede hacer una copia de seguridad del archivo agregando un argumento de extensión a -i
, por ejemplo, .backup
o .bak
:
sed -i.backup ''50001,$ d'' filename
En OS-X o FreeBSD debe proporcionar un argumento para -i
- para hacer esto mientras evita hacer una copia de seguridad:
sed -i '''' ''50001,$ d'' filename
La versión de nombre de argumento largo es la siguiente, con y sin el argumento de copia de seguridad:
sed --in-place ''50001,$ d'' filename
sed --in-place=.backup ''50001,$ d'' filename
Archivo nuevo
Para crear un nuevo archivo truncado, simplemente redirija de la cabecera al nuevo archivo:
head -n50000 oldfilename > newfilename
-
-n50000
significa el número de líneas, la cabeza por defecto es 10. -
>
significa redirigir, sobrescribir cualquier otra cosa que pueda estar allí. - Sustituya
>>
por>
si quiere agregar al nuevo archivo.
Es lamentable que no pueda redireccionar al mismo archivo, por lo que sed se recomienda para el truncamiento en el sitio.
No sed? ¡Prueba Python!
Esto es un poco más tipeo que sed. Después de todo, Sed es la abreviatura de "Stream Editor", y esa es otra razón para usarlo, para lo que la herramienta es adecuada.
Esto fue probado en Linux y Windows con Python 3:
from collections import deque
from itertools import islice
def truncate(filename, lines):
with open(filename, ''r+'') as f:
blackhole = deque((),0).extend
file_iterator = iter(f.readline, '''')
blackhole(islice(file_iterator, lines))
f.truncate(f.tell())
Para explicar el Python:
El agujero negro funciona como /dev/null
. Es un método de límite consolidado en un deque
con maxlen=0
, que es la manera más rápida de agotar un iterador en Python (que yo sepa).
No podemos simplemente iterar sobre el objeto de archivo porque el método tell
estaría bloqueado, entonces necesitamos el iter(f.readline, '''')
.
Esta función demuestra el administrador de contexto, pero es un poco superfluo ya que Python cerraría el archivo al salir de la función. El uso es simple:
>>> truncate(''filename'', 50000)
Me gustaría utilizar un terminal / shell para truncar o limitar de otro modo un archivo de texto a un cierto número de líneas.
Tengo un directorio completo de archivos de texto, para cada uno de los cuales solo son útiles las primeras ~ 50k líneas.
¿Cómo borro todas las líneas más de 50000?
Muy fácil usar sed:
sed -n ''1,50000 p'' filename
Esto solo imprimirá las líneas 1 a 50000 en el archivo ''nombre de archivo''.