Comandos.- split (Unix)

split (Unix) sirve para cuando tienes un fichero muy grande que no puedes mover entero; o para dividir un archivo comprimido que no puedes subir entero y tienes que hacerlo por partes, esto se ve mucho en los capítulos de las series, películas, etc que hay por la red. O en documentos que tienes que partir por segmentos, se puede hacer por el procesador de textos pero cuando es con un script o necesitas hacerlo por número de líneas, el comando split es el más indicado. Hay muchos otros casos en los que este comando se puede usar, estos son los que se me ocurren de momento.

Cada vez que leo un tutorial del comando split, en casi todas las ocasiones veo que mencionan a el programa hacha. Y yo no voy a ser la excepción. Bien, el hacha es un programa para Windows, que divide los ficheros en partes.

Buscando la página oficial de hacha, creo que la encontré:
http://hacha.org/. Y esa a su vez me redirigió a: http://www.ica-peru.com/index03.htm

Definición de la Wikipedia para split (Unix): "El programa split es una utilidad de los sistemas operativos tipo Unix, usada para partir un archivo en uno o más de menor tamaño. De ahí su nombre, que en inglés significa partir."

 

Ayuda

Consultar el manual e info, teclear en la terminal:

split --help

man split

info split

 

Sintaxis

split [OPCIONES]… [ENTRADA [PREFIJO]]

 

Ejemplos

Para los siguientes ejemplos, vamos a necesitar un listado de 10,000 lineas. También es conveniente trabajar una carpeta para estos ejercicios.

Puede parecer complicadas las instrucciones más abajo, pero aseguro que es mucho más complejo crear un archivo con 10,000 lineas tecleando cada una.

El siguiente script se encarga de crear la lista de números con 10,000 lineas.

Script

#!/usr/bin/env bash
crearlistado=0
while [ $crearlistado -lt 10000 ]
do
echo "${crearlistado}" >> listado.txt
let crearlistado++
done

 

Bien para crear la carpeta ~/ejercicios-para-split-y-cat en el /home, fabricar el script script-para-probar-split-y-cat.sh; darle permisos de ejecución y hacer que corra desde la terminal necesitamos ejecutar la siguiente linea:

mkdir /home/`whoami`/ejercicios-para-split-y-cat; cd "/home/`whoami`/ejercicios-para-split-y-cat"; nano "/home/`whoami`/ejercicios-para-split-y-cat/script-para-probar-split-y-cat.sh"; chmod a+x "/home/`whoami`/ejercicios-para-split/script-para-probar-split-y-cat.sh" ; source /home/`whoami`/ejercicios-para-split-y-cat/script-para-probar-split-y-cat.sh

 

Explicación: El comando whoami imprime el identificador de nuestro usuario efectivo, como esta entre acentos graves (`) hace que se ejecute primero que el comando en el que esta embebido. El comando mkdir crea la carpeta ejercicios-para-split-y-cat en el /home del usuario. El comando cd hace que terminal trabaje en dicha carpeta. Utilizamos un editor de texto sencillo para trabajar dentro de la consola. En esta línea de comandos es nano, podríamos sustituirlo por vi o el que más nos guste. El nombre y la ruta del script ya esta señalada en la línea de comandos. El comando chmod se encarga de darle permisos de ejecución y con source lo ponemos a trabajar para que cree el archivo listado.txt con las 10,000 líneas.

Cada orden de comandos esta separada por punto y coma (;) para que puedan ejecutarse en una sola línea.

Importante para los que no conocen los editores de texto para la terminal (nano, vi, etc.). Ejecutando esta linea de comandos, de pronto la promt se pone "rara"; es cuando esta abierto el nano. Es el momento para pegar el script de más arriba y seguir los pasos para salvar el documento. Por como esta configurada la linea de comandos el nombre del script y ruta ya esta asignado.

Nota.- En todos estos ejercicios la terminal esta trabajando dentro de la carpeta ~/ejercicios-para-split-y-cat. En caso de que hayamos cerrado la consola donde ejecutamos la linea de comandos anterior se emplea la siguiente línea para trabajar en dicha carpeta: cd ~/ejercicios-para-split-y-cat

 

 

a) Vamos a dividir el archivo utilizando split sin opciones:

split listado.txt

Se crean lo siguientes archivos: xaa, xab, xac, xad, xae, xaf, xag, xah, xai y xaj.

Esto es por que por defecto los archivos de salida generados se le asigna el prefijo 'x', el orden de la coletilla es alfabético y el tamaño máximo es de 1000 lineas.

Los archivos se generan en la carpeta donde esta trabajando la terminal, por eso es importante que estemos donde queremos que se guarden los ficheros.

El prefijo por defecto es una 'x'; se puede cambiar tan sencillo como poner el nombre del archivo que vamos a dividir, seguido de el prefijo deseado.

split listado.txt file

split listado.txt file.

split listado.txt segmento.

Creemos una nueva carpeta dentro de ~/ejercicios-para-split-y-cat. Que se llame segmentos-de-listado. Tecleamos en la terminal:

mkdir ~/ejercicios-para-split-y-cat/segmentos-de-listado

Hicimos esa carpeta para ver como los segmentos creados a partir de listado.txt van a dar en ella.

split listado.txt ~/ejercicios-para-split-y-cat/segmentos-de-listado/

Con este ejemplo, le decimos que la ruta donde queremos los segmentos sea ~/ejercicios-para-split-y-cat/segmentos-de-listado/ El prefijo no esta establecido por lo que los archivos quedan como: aa, ab, ac, ad, ae, af, ag, ah, ai y aj

split listado.txt ~/ejercicios-para-split-y-cat/segmentos-de-listado/file

En este ejemplo los archivos van para la misma carpeta que la anterior, pero ahora si establecimos un prefijo: 'file'.

split listado.txt ~/ejercicios-para-split-y-cat/segmentos-de-listado/file.

Segimos con la misma carpeta y casi igual sufijo. Ahora es 'file.' y la coletilla (sufijo) va a servir de extensión.

Nota.- En algunas extensiones resultaron ser para tipos de archivos. Split se encarga de dividir los ficheros, no de convertirlos. En este caso siguen siendo de texto, como el archivo de origen; aunque el sistema operativo diga que pertenecen a otro tipo.

split listado.txt ~/ejercicios-para-split-y-cat/segmentos-de-listado/segmento.

Es igual que el anterior, nada más que ahora el prefijo va a ser 'segmento.'

 

 

b) Opción -a, --suffix-length=N del comando split

Ahora necesitamos que el listado tenga 1,000,000 lineas; si, leíste bien, un millón de lineas. Podemos ponernos a copiar y pegar 100 veces las lineas del archivo listado.txt, o utilizar el script que ya tenemos sustituyendo 10000 por 1000000 y listado.txt por listado2.txt Con estos cambios cuando ejecutamos el script otra vez; se tarda unos minutos en generar el archivo listado2.txt, de aproximadamente 6.6 MB y de un millón de lineas.

Antes de seguir hay que asegurarse que la terminal este en el nivel de la carpeta donde queremos que se generen los ficheros. Ahorita cuando ejecuten split van a ver porque.

Situamos la terminal en la carpeta ~/ejercicios-para-split-y-cat con la siguiente linea:

cd ~/ejercicios-para-split-y-cat

Ahora si ejecutamos split dentro de esa misma terminal:

split listado2.txt

Nos avisa "split: output file suffixes exhausted"; si contamos los ficheros generados vemos que son 676. Multiplicando 676 por 1000 nos damos cuenta que faltan lineas.

Resulta que la longitud los sufijos no fueron suficientes para terminar el trabajo. En estos casos y en otros en los que se necesita que el sufijo de una longitud distinta a los 2 que trae por default se emplea la opción -a, --suffix-length=N de split.

split -a 4 listado2.txt

split --suffix-length=4 listado2.txt

Como le indicamos que el sufijo fuera de cuatro los archivos generados tienen los siguientes nombres xaaaa, xaaab, xaaac, xaaad, xaaae… hasta llegar al xabml; un total de 1000 ficheros y multiplicando 1000 por 1000 nos da un millón de lineas. Ahora si esta completo el volcado.

Y así como dijimos 4 sufijos podemos decir 1, 3, 7, etc.

 

 

c) Opción -b, --bytes=SIZE del comando split. SIZE es el tamaño. Esta opción permite el corte de las lineas.

Según el manual el tamaño (SIZE) se especifica con los siguientes sufijos de múltiplos:
b 512
kB 1000
K 1024
MB 1000*1000
M 1024*1024
GB 1000*1000*1000
G 1024*1024*1024,
Y también por T, P, E, Z, Y.

El archivo listado.txt es de 47.7 KB más o menos. Vamos a emplear ese y dividirlo en ficheros de 1b.

split -b 1b listado.txt

split --bytes=1b listado.txt

Se generaron 96 ficheros. Si abrimos los archivos vemos que la secuencia numérica no va del 0-9999; en mis ficheros el xaa termina en 15 y el xab comienza con 5. Es porque esta opción genera los ficheros por el tamaño indicado y si es necesario corta las lineas.

Ahora probemos con el archivo listado2.txt de aproximadamente 6.6 MB. Vamos a dividirlo en segmentos de 2 MB.

split -b 2M listado2.txt

split --bytes=2M listado2.txt

Se generan cuatro ficheros con un máximo de 2 MebiBytes

Probemos usando MB

split -b 2MB listado2.txt

split -bytes=2MB listado2.txt

Son cuatro archivos generados con un máximo de 1.9 MebiBytes

Sobre los prefijos binarios consulten:
http://es.wikipedia.org/wiki/Prefijos_binarios

 

 

d) Opción -C, --line-bytes=SIZE del comando split.

Según el manual "escribe un máximo por SIZE (tamaño) en bytes sin cortar las líneas en el archivo de salida."

Seguimos con los tamaños por peso, ahora sin que queden lineas cortadas.

Repito, según el manual el tamaño (SIZE) se especifica con los siguientes sufijos de múltiplos:
b 512
kB 1000
K 1024
MB 1000*1000
M 1024*1024
GB 1000*1000*1000
G 1024*1024*1024,
Y también por T, P, E, Z, Y.

split -C 1b listado.txt

split --line-bytes=1b listado.txt

Se generaron 96 ficheros con un máximo de 512 bytes, ahora con la numeración correcta del 0-9999. Lo comprobé abriendo los dos primeros archivos. El xaa termina en 154 y el xab comienza con 155.

split -C 2K listado.txt

split --line-bytes=2K listado.txt

Se generaron 24 segmentos con un máximo de 2 KibiBytes sin cortar lineas

split -C 20kB listado2.txt

split --line-bytes=20kB listado2.txt

Se generaron segmentos con un máximo de 19.5 KibiBytes sin cortar lineas y fueron 345 ficheros de salida.

 

 

e) Opción -d, --numeric-suffixes del comando split.

split -d listado.txt

split --numeric-suffixes listado.txt

Esta vez los sufijos son numéricos. Los archivos generados fueron: x00, x01, x02, x03, x04, x05, x06, x07, x08 y x09. Sin esta opción los sufijos fueran de xaa al xaj.

Probemos ahora con el archivo grande:

split -d listado2.txt

split --numeric-suffixes listado2.txt

El largo de los sufijos no fue suficiente. Se generaron del x00 al x99.

Para que alcancen los sufijos y el orden sea numérico; utilicemos la opción -d, --numeric-suffixes y la -a, --suffix-length=N combinadas.

split -d -a 3 listado2.txt

split -d --suffix-length=3 listado2.txt

split --numeric-suffixes -a 3 listado2.txt

split --numeric-suffixes --suffix-length=3 listado2.txt

Pues bien, ahora si alcanzaron y el sufijo es por orden numérico. Los ficheros van del x000 al x999

 

 

f) Opción -l, --lines=NUMBER del comando split.

Con esta opción decidimos cuantas lineas tiene cada fichero de salida.

split -l 25 listado.txt

split --lines=25 listado.txt

Se generan 400 ficheros de 25 lineas cada uno.

split -l 2500 listado.txt

split --lines=2500 listado.txt

Se generan 4 ficheros de 2500 lineas cada uno.

Utilicemos el archivo del millón de lineas:

split -l 100000 listado2.txt

split --lines=100000 listado2.txt

Se generan 10 ficheros de 100,000 lineas cada uno.

 

 

g) Opción --verbose del comando split.

Conforme se va ejecutando el comando split va diciendo cuales son las acciones, archivos generados, etc.

split --verbose listado.txt

Imprime en la promt el nombre de los archivos tan pronto se van generando. Me devolvió:

creating file `xaa'
creating file `xab'
creating file `xac'
creating file `xad'
creating file `xae'
creating file `xaf'
creating file `xag'
creating file `xah'
creating file `xai'
creating file `xaj'

Y como en la opción a) se crearon 10 archivos, ordenados alfabéticamente (xaa al xaj), de 1000 lineas cada uno.

 

 

h) Opción --help del comando split.

Esta opción muestra la ayuda y sale.

 

 

i) Opción --version del comando split.

Según el manual: "Muestra la información de la versión y sale."

 

 

 

 

 

Anuncios

2 thoughts on “Comandos.- split (Unix)

  1. Pingback: Travesuras

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s