Comando csplit in Linux: dividere file per righe e pattern
csplit divide un file di testo in corrispondenza di numeri di riga o di righe che soddisfano un’espressione regolare. È adatto a separare sezioni di un documento; per dividere invece in parti di dimensione o numero di righe prefissati, è più diretto usare split per righe o byte.
Il criterio indica il punto in cui inizia la parte successiva. Senza un prefisso esplicito, GNU csplit genera nomi come xx00 e xx01. Usate una directory nuova e prefissi che non coincidano con file da conservare: il comando può sovrascrivere un output già presente.
Sintassi e significato del punto di divisione
csplit [opzioni] file-input criterio...
Un numero come 11 divide prima della riga 11: la prima parte contiene le righe da 1 a 10 e la successiva comincia dalla riga 11. Un criterio come '/^Chapter /' divide prima della riga che corrisponde all’espressione: senza altre opzioni, la riga del titolo rimane all’inizio della parte successiva.
Le virgolette singole proteggono il criterio dall’interpretazione della shell. ^ ancora la ricerca all’inizio della riga, mentre lo spazio dopo Chapter fa parte del criterio: non sostituite quel testo con la traduzione italiana se il file contiene proprio la parola inglese. Consultate man csplit e, in GNU, csplit --version per le opzioni disponibili.
Esempi completi con input già preparati
Dividere alla riga 11
Eseguite il primo blocco in Bash con gli strumenti GNU. Crea una directory nuova csplit-demo, vi entra e prepara tutti i file usati negli esempi seguenti. Se la directory esiste già, si interrompe senza riutilizzarla. Se un passaggio fallisce, risolvete il problema prima di continuare.
mkdir csplit-demo && cd csplit-demo && (
set -e
set -o noclobber
seq 12 > notes.txt
printf 'Preface\nChapter One\nA\nChapter Two\nB\n' > report.txt
printf 'Preface\nChapter One\nA\nChapter Two\nB\nChapter Three\nC\n' > book.txt
csplit -f part- notes.txt 11
)
part-00 contiene i numeri da 1 a 10, uno per riga; part-01 contiene 11 e 12. Csplit stampa normalmente la dimensione in byte di ogni parte: con questi dati ASCII e terminatori di riga LF, le due righe diagnostiche sono 21 e 6. Non sono numeri di righe né nomi dei file. La shell rimane in csplit-demo per i comandi successivi.
Dividere al primo titolo corrispondente
Il file report.txt contiene una prefazione e due titoli di capitolo. Un solo criterio divide alla prima corrispondenza:
csplit -f section- report.txt '/^Chapter /'
section-00 contiene Preface. section-01 inizia con Chapter One e contiene anche Chapter Two con i rispettivi dati: una sola ricerca non implica automaticamente una divisione a ogni titolo.
Ripetere il criterio per tutti i capitoli
Con GNU csplit, '{*}' ripete il criterio precedente quante volte possibile. Le virgolette evitano che la shell interpreti parentesi o asterisco:
csplit -f chapter- book.txt '/^Chapter /' '{*}'
Si ottengono quattro parti: chapter-00 conserva la prefazione; chapter-01, chapter-02 e chapter-03 iniziano rispettivamente con Chapter One, Chapter Two e Chapter Three. Ogni titolo resta con il testo del suo capitolo. Se il primo titolo fosse già sulla prima riga, la parte che lo precede potrebbe essere vuota; valutate -z solo se non vi serve conservare le parti vuote.
Controllare il contenuto prima e dopo un pattern
Il blocco seguente crea una sottodirectory nuova e isola il piccolo esempio dal prefisso part- già usato. -s elimina soltanto la stampa delle dimensioni: gli errori continuano a essere segnalati.
mkdir pattern-demo && (
set -e
cd pattern-demo
printf 'one\nTWO\ntwo\n' > sample.txt
csplit -s -f part- sample.txt '/^TWO$/'
cat part-00
cat part-01
)
I due comandi cat mostrano in sequenza:
one
TWO
two
Il file part-00 contiene one e il terminatore di riga. part-01 contiene TWO e two sulle righe successive. L’espressione ^TWO$ richiede l’intera riga maiuscola, quindi non corrisponde alla parola minuscola. La subshell lascia la shell chiamante nella directory csplit-demo.
Opzioni principali e criteri ripetuti
| Opzione | Funzione in GNU csplit |
|---|---|
-f prefisso |
Imposta il prefisso dei file di output al posto di xx. |
-n N |
Imposta il numero di cifre del suffisso numerico; il valore predefinito è 2. |
-s |
Non stampa le dimensioni delle parti sullo standard output. |
-z |
Omette i file di output vuoti. |
-k |
Conserva gli output in caso di errore, invece di rimuoverli. Non trasforma l’errore in un risultato riuscito. |
Per ottenere nomi a tre cifre con un prefisso nuovo, dalla directory della prova usate csplit -s -n 3 -f wide- notes.txt 11: genera wide-000 e wide-001. La modifica del suffisso cambia i nomi, non il contenuto delle parti.
Una ripetizione '{N}' applica il criterio precedente altre N volte. '{*}' continua finché possibile ed è un’estensione GNU: verificate il manuale locale prima di usarla in uno script destinato ad altre implementazioni. Per i tre titoli del file di prova, un criterio iniziale seguito da '{2}' richiede tre corrispondenze complessive.
Pattern mancanti, errori e verifica delle parti
Un criterio che non trova la riga prevista può terminare con errore. In GNU csplit, il comportamento predefinito rimuove gli output creati quando si verifica un errore; con -k rimangono disponibili per l’ispezione. In quel caso possono essere parziali: controllate lo stato del comando e i contenuti prima di considerarli un’elaborazione completa.
Non eseguite csplit in una directory con output omonimi da conservare. La rimozione degli output su errore non è un meccanismo di ripristino dei file eventualmente sovrascritti. Anche set -o noclobber riguarda le redirezioni della shell, non impedisce a csplit di aprire i propri output: scegliete una directory nuova per ripetere la prova.
Il numero e la posizione dei capitoli dipendono dai dati. Controllate titoli duplicati, spazi iniziali, maiuscole e righe che contengono il titolo come normale testo. I file con terminatori CRLF possono richiedere attenzione: il carattere CR prima del fine riga può impedire una corrispondenza come ^TWO$. Esaminate il formato e trasformate una copia, se necessario, prima di applicare il criterio.
Per il file di prova, la ricostruzione è verificabile con cat chapter-00 chapter-01 chapter-02 chapter-03 | cmp book.txt -: lo stato deve essere zero e non viene stampata alcuna differenza. Questo confronto verifica il contenuto concatenato; controllate anche che i confini siano quelli desiderati. Criteri che saltano testo, come %REGEXP%, o opzioni che sopprimono le righe corrispondenti non permettono di presumere la stessa ricostruzione.
I comandi mostrati leggono gli input e li lasciano disponibili. Per tornare alla directory iniziale usate cd ..; controllate percorso e materiali della prova prima di eliminarli. Non trattate un insieme di parti non verificato come sostituto dell’originale.
Domanda frequente
Quando scegliere split e quando csplit?
Usate split per dividere a intervalli di righe o byte. Usate csplit per iniziare una nuova parte a una riga precisa o a un titolo riconoscibile tramite un pattern. La scelta dipende dal criterio: un capitolo può avere una lunghezza diversa dagli altri, quindi la divisione per contenuto non produce necessariamente parti di dimensioni uguali.
Documentazione di riferimento
La pagina di manuale del progetto GNU Coreutils per csplit descrive numeri di riga, espressioni regolari, ripetizioni e conservazione degli output. Per approfondire, consultate info '(coreutils) csplit invocation' se installato e confrontate le opzioni con man csplit sul sistema usato.




