2010-07-07 24 views
13

? Tengo un archivo que continúa con un número de líneas. Quiero dividir el archivo en n no de archivos con nombres particulares. No importa cuántas líneas hay en cada archivo. Solo quiero un número especial de archivos (digamos 5). aquí el problema es que el no de líneas en el archivo original sigue cambiando. Entonces necesito calcular el número de líneas y luego dividir los archivos en 5 partes. Si es posible, tenemos que enviar cada uno de ellos a diferentes directorios.¿Cómo puedo dividir un archivo en n de partes

+2

¿Con qué? Una herramienta, un lenguaje de programación, un script ...? –

+0

Windows, Linux? ¿Qué idioma (s) tienes disponible? –

+0

Tengo que hacerlo en UNIX –

Respuesta

4

en Linux, hay un comando split, piezas

split --lines=1m /path/to/large/file /path/to/output/file/prefix 

salida de tamaño fijo de la entrada a PREFIXaa, PREFIXab, ...; el tamaño predeterminado es 1000 líneas, y PREFIX predeterminado es 'x'. Sin ENTRADA, o cuando ENTRADA es -, lea la entrada estándar.

...

-l, --lines = número líneas puesto número por archivo de salida

...

Usted tendría que calcular el tamaño real de las divisiones de antemano, sin embargo.

+1

Esto se divide en líneas o bytes? –

+0

aquí el tamaño del archivo también cambia todos los días ... Necesito una respuesta general en la que no se deba usar el tamaño o no. –

+0

Tengo que escribir un script de shell para esto. ¿Alguien me puede ayudar con –

6

Suponiendo que está procesando un archivo de texto, entonces wc -l para determinar el número total de líneas y split -l para dividir en un número específico de líneas (total/5 en su caso). Esto funciona en UNIX/Mac y Windows (si tiene cygwin instalado)

0

Puedo pensar en algunas formas de hacerlo. Lo que usaría depende mucho de los datos.

  1. líneas son de longitud fija: Encontrar el tamaño del archivo mediante la lectura de su entrada en la guía y se divide por la longitud de línea para obtener el número de líneas. Use esto para determinar cuántas líneas por archivo.

  2. Los archivos solo necesitan tener aproximadamente el mismo número de líneas. Vuelva a leer el tamaño del archivo desde la entrada del directorio. Lea las primeras N líneas (N debe ser pequeña pero una fracción razonable del archivo) para calcular una longitud de línea promedio. Calcule el número aproximado de líneas en función del tamaño del archivo y la longitud de línea media pronosticada. Esto supone que la longitud de la línea sigue una distribución normal. Si no, ajuste su método para muestrear líneas al azar (usando seek() o algo similar). Rebobina el archivo después de tener tu promedio, luego divídelo según la longitud de línea predicha.

  3. Lea el archivo dos veces. La primera vez cuente el número de líneas. La segunda vez dividiendo el archivo en las piezas requeridas.

EDITAR: El uso de un script de shell (de acuerdo con sus comentarios), la versión aleatorio de # 2 sería difícil a menos que usted escribió un pequeño programa para hacer eso por usted. Debería poder usar ls -l para obtener el tamaño de archivo, wc -l para contar el número exacto de líneas, y head -nNNN | wc -c para calcular la longitud de línea promedio.

19

En bash, puede usar el comando split para dividirlo en función del número de líneas deseadas. Puede usar el comando wc para averiguar cuántas líneas desea. Aquí está wc combinado con split en una línea.

Por ejemplo, para dividir onepiece.log en 5 partes

split -l$((`wc -l < onepiece.log`/5)) onepiece.log onepiece.split.log -da 4 

Esto creará archivos como onepiece.split.log0000 ...

Nota: división de fiesta redondea a la baja, por lo que si hay un resto no lo hará ser un archivo de la sexta parte.

+8

** split -da 4 -l $ (('wc -l grasshopper

+0

excelente mejora, @grasshopper – Flowpoke

+0

esta respuesta es más conciso que las dos [preguntas arriba más altas] (http://stackoverflow.com/questions/7764755/unix-how-to-split- a-file-into-equal-parts-without-breaking-individual-lines) en stackoverflow y askubuntu. –

Cuestiones relacionadas