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.