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.
En este caso tenemos un fichero con casi diez millones de líneas:
$ wc -l test.txt 8136704 test.txt
$ 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
NOTA:
Para volver a unir los archivos, utilizamos el comando "cat", ejemplo:
$ cat test_aa test_ab test_ac test_ad test_ae test_aftest_af test_ag > archivo_unido.txt
Fuente: http://rm-rf.es/separar-un-fichero-en-bash-con-split/
Angel J. Reynoso
kp01
Tel.: 829-997-4870
kp01aj@gmail.com
No hay comentarios:
Publicar un comentario