¿Cómo puedo dividir un archivo de texto grande en archivos más pequeños con el mismo número de líneas?
Tengo un archivo de texto plano grande (por número de líneas) que me gustaría dividir en archivos más pequeños, también por número de líneas. Entonces, si mi archivo tiene alrededor de 2 millones de líneas, me gustaría dividirlo en 10 archivos que contengan 200k líneas, o 100 archivos que contengan 20k líneas (más un archivo con el resto; no importa que sea divisible uniformemente).
Podría hacer esto con bastante facilidad en Python, pero me pregunto si hay algún tipo de forma ninja de hacerlo usando las utilidades Bash y Unix (en lugar de realizar bucles y contar/particionar líneas manualmente).
Eche un vistazo al comando de división:
$ split --help
Usage: split [OPTION] [INPUT [PREFIX]]
Output fixed-size pieces of INPUT to PREFIXaa, PREFIXab, ...; default
size is 1000 lines, and default PREFIX is `x'. With no INPUT, or when INPUT
is -, read standard input.
Mandatory arguments to long options are mandatory for short options too.
-a, --suffix-length=N use suffixes of length N (default 2)
-b, --bytes=SIZE put SIZE bytes per output file
-C, --line-bytes=SIZE put at most SIZE bytes of lines per output file
-d, --numeric-suffixes use numeric suffixes instead of alphabetic
-l, --lines=NUMBER put NUMBER lines per output file
--verbose print a diagnostic to standard error just
before each output file is opened
--help display this help and exit
--version output version information and exit
Podrías hacer algo como esto:
split -l 200000 filename
que creará archivos cada uno con 200000 líneas llamadas xaa xab xac
...
Otra opción, dividir por tamaño del archivo de salida (aún se divide en saltos de línea):
split -C 20m --numeric-suffixes input_filename output_prefix
Crea archivos como output_prefix01 output_prefix02 output_prefix03 ...
cada uno de un tamaño máximo de 20 megabytes.
Utilice el comando dividir :
split -l 200000 mybigfile.txt
Sí, hay un split
comando. Dividirá un archivo por líneas o bytes.
$ split --help
Usage: split [OPTION]... [INPUT [PREFIX]]
Output fixed-size pieces of INPUT to PREFIXaa, PREFIXab, ...; default
size is 1000 lines, and default PREFIX is `x'. With no INPUT, or when INPUT
is -, read standard input.
Mandatory arguments to long options are mandatory for short options too.
-a, --suffix-length=N use suffixes of length N (default 2)
-b, --bytes=SIZE put SIZE bytes per output file
-C, --line-bytes=SIZE put at most SIZE bytes of lines per output file
-d, --numeric-suffixes use numeric suffixes instead of alphabetic
-l, --lines=NUMBER put NUMBER lines per output file
--verbose print a diagnostic just before each
output file is opened
--help display this help and exit
--version output version information and exit
SIZE may have a multiplier suffix:
b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024,
GB 1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.
Para dividir un archivo de texto grande en archivos más pequeños de 1000 líneas cada uno:
split <file> -l 1000
Para dividir un archivo binario grande en archivos más pequeños de 10 M cada uno:
split <file> -b 10M
Para consolidar archivos divididos en un solo archivo:
cat x* > <file>
Divida un archivo, cada división tiene 10 líneas (excepto la última división):
split -l 10 filename
Divida un archivo en 5 archivos. El archivo se divide de manera que cada división tenga el mismo tamaño (excepto la última división):
split -n 5 filename
Divida un archivo con 512 bytes en cada división (excepto la última división; use 512k para kilobytes y 512m para megabytes):
split -b 512 filename
Divida un archivo con como máximo 512 bytes en cada división sin dividir líneas:
split -C 512 filename