Cómo presentar una división en un número de línea [cerrado]

94

Quiero dividir un archivo de registro de 400k líneas de un número de línea en particular.

Para esta pregunta, hagamos de este un número arbitrario de 300k.

¿Existe un comando de Linux que me permita hacer esto ( dentro del script )?

Sé que splitme permite dividir el archivo en partes iguales, ya sea por tamaño o por números de línea, pero eso no es lo que quiero. Quiero los primeros 300k en un archivo y los últimos 100k en el segundo archivo.

Cualquier ayuda sería apreciada. ¡Gracias!

Pensándolo bien, esto sería más adecuado para el superusuario o el sitio predeterminado del servidor.

desnormalizador
fuente
16
Creo que esta pregunta está bien aquí. Tiene una tarea de programación que está intentando resolver con un script de shell; si se trata de una sola línea que utiliza herramientas Unix ampliamente disponibles, ¡tanto mejor!
Jim Lewis
Pensé lo mismo. Pero, de nuevo, no estaba escribiendo un script de shell :) bueno, encontré mi respuesta de todos modos. Gracias
desnormalizador
5
Esta pregunta está bien, sin lugar a dudas, es una pregunta de programación y tampoco está demasiado localizada
Peter
9
¿Por qué es esta una pregunta fuera de tema? La policía del pensamiento está más loca que nunca.
Karel Bílek
6
Aunque esta pregunta puede estar un poco fuera de tema, es muy votada y es el primer resultado en los motores de búsqueda con consultas como "archivo dividido de linux en la línea". Por lo tanto, sugiero reabrir esta pregunta, para que se puedan agregar otras respuestas valiosas. O al menos hacer un enlace a la pregunta más relevante sobre SU.
Antoine Pinsard

Respuestas:

178
file_name=test.log

# set first K lines:
K=1000

# line count (N): 
N=$(wc -l < $file_name)

# length of the bottom file:
L=$(( $N - $K ))

# create the top of file: 
head -n $K $file_name > top_$file_name

# create bottom of file: 
tail -n $L $file_name > bottom_$file_name

Además, pensándolo bien, la división funcionará en su caso, ya que la primera división es más grande que la segunda. Split coloca el saldo de la entrada en la última división, por lo que

split -l 300000 file_name

saldrá xaacon 300k líneas y xabcon 100k líneas, para una entrada con 400k líneas.

académicoRobot
fuente
Gracias. Encontré una pregunta con una respuesta similar en superusuario, es decir. use tail, etc. Y, sí, split funcionará con mi ejemplo, pero no siempre mi ejemplo ha sido 100K.
desnormalizador
2
Si está intentando hacer esto en Windows y no quiere usar Cygwin, este proyecto proporciona todas las utilidades necesarias como binarios nativos de win32 - unxutils.sourceforge.net
Jonathon Hill
15
Me gustaría utilizar tail -n +L file_name > bottom_filecuando simplemente L=K+1sin necesidad de ejecutar wcprimero
Hashbrown
2
Preferiría usar sed -n '1,1000p' test.log > top_test.log ; sed '1,1000d' test.log > bottom_test.log. IHMO, esto es más sencillo y no requiere calcular el número total de líneas. Además, todavía funciona si se agregaron líneas entre la ejecución de cada comando.
Antoine Pinsard
Para algunos archivos, esta respuesta deja una línea, pero la edición sugerida por Hashbrown soluciona el problema.
scharette