Usa il comando split di Linux:
split -l 20 file.txt new
Dividi il file "file.txt" in file che iniziano con il nome "nuovo" ciascuno contenente 20 righe di testo ciascuno.
Digita man split
al prompt di Unix per ulteriori informazioni. Tuttavia dovrai prima rimuovere l'intestazione da file.txt (usando il tail
comando, ad esempio) e quindi aggiungerlo nuovamente a ciascuno dei file divisi.
Trasformato in una funzione. Ora puoi chiamare splitCsv <Filename> [chunkSize]
splitCsv() {
HEADER=$(head -1 $1)
if [ -n "$2" ]; then
CHUNK=$2
else
CHUNK=1000
fi
tail -n +2 $1 | split -l $CHUNK - $1_split_
for i in $1_split_*; do
sed -i -e "1i$HEADER" "$i"
done
}
Trovato su:http://edmondscommerce.github.io/linux/linux-split-file-eg-csv-and-keep-header-row.html
One-liner che conserva la riga di intestazione in ogni file diviso. Questo esempio fornisce 999 righe di dati e una riga di intestazione per file.
cat bigFile.csv | parallel --header : --pipe -N999 'cat >file_{#}.csv'
https://stackoverflow.com/a/53062251/401226 dove la risposta contiene commenti sull'installazione della versione corretta di parallel (in Ubuntu usa il pacchetto parallelo specifico, che è più recente di quello fornito in bundle in moreutils)
Dovrebbe funzionare!!!
file_name
=Nome del file che vuoi dividere.
10000
=Numero di righe che ogni file diviso conterrebbe
file_part_
=Prefisso del nome del file diviso (file_part_0, file_part_1, file_part_2..etc continua)
split -d -l 10000 file_name.csv file_part_