Usare split per dividere un file grande in tanti file più piccoli

Usare split per dividere un file grande in tanti file più piccoli

Mi capita spesso di dover maneggiare file di testo molto grandi, come log di applicazione o export in csv di tabelle di database. Talvolta può essere necessario, per poterli elaborare, dividere questi file in file più piccoli e quindi più maneggevoli, senza però rischiare di corromperne il contenuto.

Il comando split fa proprio questo: prende un file di testo grande e lo divide in tanti file più piccoli.

Vediamo un primo esempio: supponiamo di avere il file file,csv e di volerlo dividere in tanti file piccoli.


$ ls -la
totale 18664
drwxr-xr-x  2 maurizio maurizio     4096 ago 17 19:52 ./
drwxr-xr-x 66 maurizio maurizio     4096 ago 17 19:29 ../
-rw-rw-r--  1 maurizio maurizio 19103097 lug 22 16:59 file.csv
$ split file.csv 
$ ls -la
totale 37584
drwxr-xr-x  2 maurizio maurizio     4096 ago 17 19:52 ./
drwxr-xr-x 66 maurizio maurizio     4096 ago 17 19:29 ../
-rw-rw-r--  1 maurizio maurizio 19103097 lug 22 16:59 file.csv
-rw-r--r--  1 maurizio maurizio    75320 ago 17 19:52 xaa
-rw-r--r--  1 maurizio maurizio    76293 ago 17 19:52 xab
-rw-r--r--  1 maurizio maurizio    75946 ago 17 19:52 xac
-rw-r--r--  1 maurizio maurizio    83935 ago 17 19:52 xad
-rw-r--r--  1 maurizio maurizio    88002 ago 17 19:52 xae
-rw-r--r--  1 maurizio maurizio    80789 ago 17 19:52 xaf
......

Il comando split, partendo dal file originale file.csv, ha generato tanti piccoli file ognuno contenente al massimo 1000 righe.

Si possono usare alcuni parametri per controllare l'output di split, ad esempio:

-l : imposta il numero massime di righe per ogni file generato -b : imposta il numero massimo di bytes per ogni file generato -n : imposta il numero dei file da produrre in uscita

Attenzione però che le tre opzioni non si possono usare insieme, cioè occorre decidere se si vuole dividere i file per numero di righe, per ampiezza in byte o per numero di file che vogliamo ottenere. Inoltre se scegliamo di usare l'opzione -b o -n, dobbiamo ricordare che split non conserverà l'integrità delle singole linee del file.

Si può aggiungere dopo il nome del file da processare una stringa che split userà come profisso per generare i nomi dei file di output.

Ad esempio:


split -l 8000  file.csv out_

Genererà dei file di 8000 righe con nome out_XXX dove XXX sarà una stringa tipo, aa, ab, ac... e così via. Utilizziamo lo switch -d se invece preferiamo invece avere file di output il cui nome viene costruito con un numerico progressivo, ad esempio:


$ split -l 8000 -d  file.csv out 
$ ls
file.csv  out01  out03  out05  out07  out09  out11  out13  out15  out17  out19  out21  out23  out25  out27
out00     out02  out04  out06  out08  out10  out12  out14  out16  out18  out20  out22  out24  out26  out28

Per concludere vediamo invece come rimettere insieme i file per ricostruire il file originale: basta usare il comando cat. Nell'esempio di prima:

$ cat out* > newfile.csv

Il file newfile.csv sarà assolutamente identico a file.csv da cui siamo partiti.

Currently there are no comments, so be the first!