split în Linux / Bash

Procesare și filtrare text POSIX / GNU coreutils

Împarte un fișier mare în mai multe fișiere mai mici, după numărul de rânduri sau după dimensiune.

Sintaxă comandă
split [-l RÂNDURI | -b DIMENSIUNE] [fișier [prefix]]

Ce face split

Comanda split taie un fișier în bucăți. Cu -l fiecare bucată are un număr fix de rânduri (util pentru CSV-uri și jurnale mari), iar cu -b are o dimensiune fixă în octeți (util pentru arhive care trebuie trimise în părți).

Bucățile se numesc implicit xaa, xab, xac și așa mai departe; poți da propriul prefix ca ultim argument. Pentru că numele sunt în ordine alfabetică, fișierul inițial se reface simplu cu cat prefix* > fisier. Versiunea GNU are în plus sufixe numerice (-d), extensie pentru bucăți (--additional-suffix) și împărțirea în N părți egale (-n).

Opțiuni și argumente

Opțiune / Parametru Descriere
-l N Câte N rânduri în fiecare bucată (implicit 1000).
-b DIMENSIUNE Câți octeți în fiecare bucată; în GNU acceptă sufixe ca K, M, G (ex. -b 100M).
-d GNU: sufixe numerice (00, 01…) în loc de litere.
--additional-suffix=SUF GNU: adaugă o extensie fiecărei bucăți (ex. .csv).
-n N GNU: împarte fișierul în N bucăți de dimensiuni egale (-n l/N fără a tăia rânduri).

Exemple

Exemplul 1: Împărțirea unui fișier în bucăți de câte 4 rânduri

Zece rânduri împărțite câte patru dau trei fișiere: ultimul are doar rândurile rămase. La final refacem fișierul și verificăm cu cmp că este identic.

seq 1 10 > numere.txt
split -l 4 numere.txt parte_
for f in parte_*; do
  echo "$f: $(tr '\n' ' ' < "$f")"
done
cat parte_* > refacut.txt
cmp numere.txt refacut.txt && echo "Fișierul refăcut este identic."

Rezultat

parte_aa: 1 2 3 4 
parte_ab: 5 6 7 8 
parte_ac: 9 10 
Fișierul refăcut este identic.

Exemplul 2: Împărțirea după dimensiune

Fișierul are 2500 de octeți; cu -b 1000 rezultă două bucăți de 1000 și una de 500.

head -c 2500 /dev/zero > arhiva.bin
split -b 1000 arhiva.bin arhiva.part.
for f in arhiva.part.*; do
  echo "$f: $(wc -c < "$f" | tr -d ' ') octeți"
done

Rezultat

arhiva.part.aa: 1000 octeți
arhiva.part.ab: 1000 octeți
arhiva.part.ac: 500 octeți

Exemplul 3: Bucăți CSV numerotate (GNU)

Pentru un import pe bucăți, păstrăm antetul deoparte și împărțim restul în fișiere numerotate cu extensia .csv.

tail -n +2 comenzi.csv | split -l 50000 -d --additional-suffix=.csv - comenzi_
ls comenzi_*

Ieșire în terminal

comenzi_00.csv  comenzi_01.csv  comenzi_02.csv

Greșeli frecvente

  • Prefix fără separator: split -l 100 date.csv date creează dateaa, dateab; un prefix ca date_ sau date.part. e mai ușor de citit.
  • Împărțirea unui CSV cu antet: doar prima bucată primește rândul de antet. Scoate antetul înainte (tail -n +2) și adaugă-l la fiecare bucată dacă programul care le citește are nevoie de el.

Comenzi înrudite

  • cat: Afișează conținutul unuia sau mai multor fișiere și le concatenează în ieșirea standard.
  • head: Afișează primele linii (implicit primele 10) dintr-un fișier sau flux de date.
  • tail: Afișează ultimele linii dintr-un fișier și permite monitorizarea în timp real a datelor noi.
  • wc: Contorizează numărul de linii, cuvinte și octeți dintr-un fișier sau flux de date.