El comando split permite de forma muy sencilla separar un fichero en varias partes, pudiendo elegir cada cuantas líneas hacer la división así como el prefijo del nombre de los ficheros resultantes. Vamos a ver alguno ejemplo.
Actualización: no recordaba que ya había hecho un post de split, demasiados artículos ;) de todas formas hay más información en este. No lo voy a borrar.
En este caso tenemos un fichero con casi diez millones de líneas:
$ wc -l test.txt 8136704 test.txt
Si necesitamos trabajar con el fichero y no resulta comodo que sea tan grande podemos usar el comando split. Vamos por ejemplo a separarlo en ficheros cada 200000 líneas:
$ split -l 200000 test.txt
Y el resultado:
-rw-rw-r-- 1 alex alex 400000 Mar 12 20:48 xaa -rw-rw-r-- 1 alex alex 400000 Mar 12 20:48 xab -rw-rw-r-- 1 alex alex 400000 Mar 12 20:48 xac -rw-rw-r-- 1 alex alex 400000 Mar 12 20:48 xad -rw-rw-r-- 1 alex alex 400000 Mar 12 20:48 xae -rw-rw-r-- 1 alex alex 400000 Mar 12 20:48 xaf -rw-rw-r-- 1 alex alex 400000 Mar 12 20:48 xag -rw-rw-r-- 1 alex alex 400000 Mar 12 20:48 xah -rw-rw-r-- 1 alex alex 400000 Mar 12 20:48 xai -rw-rw-r-- 1 alex alex 400000 Mar 12 20:48 xaj -rw-rw-r-- 1 alex alex 400000 Mar 12 20:48 xak -rw-rw-r-- 1 alex alex 400000 Mar 12 20:48 xal -rw-rw-r-- 1 alex alex 400000 Mar 12 20:48 xam -rw-rw-r-- 1 alex alex 400000 Mar 12 20:48 xan [...]
Cada fichero tiene efectivamente 200000 líneas:
$ wc -l xaa 200000 xaa
Para evitar el nombrado por defecto podemos seleccionar el prefijo a utilizar para el nombre de cada fichero:
$ split -l 200000 test.txt test_
Y ahora el resultado es:
$ ls -l test_* -rw-rw-r-- 1 alex alex 400000 Mar 12 20:50 test_aa -rw-rw-r-- 1 alex alex 400000 Mar 12 20:50 test_ab -rw-rw-r-- 1 alex alex 400000 Mar 12 20:50 test_ac -rw-rw-r-- 1 alex alex 400000 Mar 12 20:50 test_ad -rw-rw-r-- 1 alex alex 400000 Mar 12 20:50 test_ae -rw-rw-r-- 1 alex alex 400000 Mar 12 20:50 test_af -rw-rw-r-- 1 alex alex 400000 Mar 12 20:50 test_ag -rw-rw-r-- 1 alex alex 400000 Mar 12 20:50 test_ah -rw-rw-r-- 1 alex alex 400000 Mar 12 20:50 test_ai [...]
También podemos dividir por tamaño en lugar de número de líneas:
$ split -b 1000000 test.txt test_
Y el resultado:
-rw-rw-r-- 1 alex alex 1000000 Mar 12 20:51 test_aa -rw-rw-r-- 1 alex alex 1000000 Mar 12 20:51 test_ab -rw-rw-r-- 1 alex alex 1000000 Mar 12 20:51 test_ac -rw-rw-r-- 1 alex alex 1000000 Mar 12 20:51 test_ad -rw-rw-r-- 1 alex alex 1000000 Mar 12 20:51 test_ae -rw-rw-r-- 1 alex alex 1000000 Mar 12 20:51 test_af -rw-rw-r-- 1 alex alex 1000000 Mar 12 20:51 test_ag [...]
En la propia ayuda o página man encontraréis más opciones disponibles:
$ 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 -e, --elide-empty-files do not generate empty output files with `-n' --filter=COMMAND write to shell COMMAND; file name is $FILE -l, --lines=NUMBER put NUMBER lines per output file -n, --number=CHUNKS generate CHUNKS output files. See below -u, --unbuffered immediately copy input to output with `-n r/...' --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 be (or may be an integer optionally followed by) one of following: KB 1000, K 1024, MB 1000*1000, M 1024*1024, and so on for G, T, P, E, Z, Y. CHUNKS may be: N split into N files based on size of input K/N output Kth of N to stdout l/N split into N files without splitting lines l/K/N output Kth of N to stdout without splitting lines r/N like `l' but use round robin distribution r/K/N likewise but only output Kth of N to stdout