Separar un fichero en bash con split

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

Un comentario en “Separar un fichero en bash con split

  1. Pingback: Bitacoras.com

Comments are closed.