2010-07-07 15 views
13

Ho un file che continua un po 'di no delle righe. Voglio dividere il file in n no.of con nomi particolari. Non importa quante linee presenti in ogni file. Voglio solo alcuni file no.of (diciamo 5). qui il problema è il no delle righe nel file originale continua a cambiare. Quindi ho bisogno di calcolare no di linee, quindi basta dividere i file in 5 parti. Se possibile, dobbiamo inviare ciascuno di loro in diverse directory.Come dividere un file in n nessuna delle parti

+2

Utilizzare cosa? Uno strumento, un linguaggio di programmazione, uno script ...? –

+0

Windows, Linux? Che lingua/e hai/i a disposizione? –

+0

Devo farlo in UNIX –

risposta

4

In Linux, c'è un split comando, pezzi

split --lines=1m /path/to/large/file /path/to/output/file/prefix 

uscita dimensione fissa di INPUT PREFIXaa, PREFIXab, ...; la dimensione predefinita è 1000 righe e PREFIX predefinito è 'x'. Senza INPUT o quando INPUT è -, leggi l'input standard.

...

-l, --lines = NUMERO linee put Numero per file di output

...

Si dovrà calcolare la dimensione reale delle spaccature in anticipo, però.

+1

Questo si divide su linee o byte? –

+0

qui la dimensione del file cambia anche giornalmente .. Quindi ho bisogno di una risposta generale in cui non dovremmo usare né la dimensione né il no. Delle righe –

+0

Devo scrivere uno script di shell per questo. Qualcuno può aiutarmi con esso –

6

Supponendo che si sta elaborando un file di testo poi wc -l per determinare il numero totale di linee e split -l per dividere in un numero specificato di righe (totale/5 nel tuo caso). Funziona su UNIX/Mac e Windows (se hai cygwin installato)

0

Posso pensare ad alcuni modi per farlo. Quale useresti dipende molto dai dati.

  1. Le linee sono a lunghezza fissa: Trovare la dimensione del file con la lettura è voce di directory e dividere per la lunghezza della linea per ottenere il numero di linee. Usalo per determinare quante linee per file.

  2. I file devono avere solo lo stesso numero di righe. Leggere nuovamente la dimensione del file dalla voce della directory. Leggere le prime N righe (N dovrebbe essere piccola ma una parte ragionevole del file) per calcolare una lunghezza della linea media. Calcola il numero approssimativo di righe in base alla dimensione del file e alla lunghezza della linea media prevista. Ciò presuppone che la lunghezza della linea segua una distribuzione normale. In caso contrario, regolare il metodo in modo casuale per campionare le linee (usando seek() o qualcosa di simile). Riavvolgi il file dopo aver ottenuto la media, quindi suddividilo in base alla lunghezza della linea prevista.

  3. Leggere il file due volte. La prima volta conta il numero di linee. La seconda volta che divide il file nei pezzi necessari.

EDIT: utilizzando uno script di shell (secondo i vostri commenti), la versione randomizzato di # 2 sarebbe difficile a meno che non hai scritto un piccolo programma di farlo per voi. Dovresti essere in grado di utilizzare ls -l per ottenere le dimensioni del file, wc -l per contare il numero esatto di righe e head -nNNN | wc -c per calcolare la lunghezza media della linea.

19

In bash, è possibile utilizzare il comando split per dividerlo in base al numero di righe desiderato. È possibile utilizzare il comando wc per capire quante linee sono desiderate. Ecco wc combinato con con split in una riga.

Ad esempio, per dividere onepiece.log in 5 parti

split -l$((`wc -l < onepiece.log`/5)) onepiece.log onepiece.split.log -da 4 

Questo creerà i file come onepiece.split.log0000 ...

Nota: divisione bash arrotonda verso il basso, quindi se c'è un resto non ci sarà essere un sesto file di parti.

+8

** split -da 4 -l $ (('wc -l grasshopper

+0

eccellente miglioramento, @grasshopper – Flowpoke

+0

questa risposta è più concisa rispetto alle due [domande con maggiore upvoted] (http://stackoverflow.com/questions/7764755/unix-how-to-split- a-file-in-equal-parts-without-breaking-individual-lines) su stackoverflow e askubuntu. –

Problemi correlati