Come file diviso in un numero di riga [chiuso]


94

Voglio dividere un file di registro lungo 400k righe da un numero di riga particolare.

Per questa domanda, rendiamo questo un numero arbitrario 300k.

C'è un comando linux che mi permette di farlo ( all'interno dello script )?

So splitche mi consente di dividere il file in parti uguali per dimensione o numeri di riga, ma non è quello che voglio. Voglio i primi 300k in un file e gli ultimi 100k nel secondo file.

Qualsiasi aiuto sarebbe apprezzato. Grazie!

Ripensandoci, questo sarebbe più adatto al sito superuser o serverfault.


16
Penso che questa domanda vada bene qui. Hai un compito di programmazione che stai cercando di risolvere con uno script di shell; se si tratta di una riga di testo che utilizza strumenti Unix ampiamente disponibili, tanto meglio!
Jim Lewis

Pensavo lo stesso. Ma poi di nuovo non stavo scrivendo uno script di shell :) vabbè, ho comunque trovato la mia risposta. Grazie
denormalizer

5
Questa domanda va bene, senza dubbio, è una domanda di programmazione e non è nemmeno troppo localizzata
Peter

9
perché questa è una domanda fuori tema? la polizia del pensiero è più pazza che mai.
Karel Bílek

6
Anche se questa domanda potrebbe essere un po 'fuori tema, è molto votata ed è il primo risultato nei motori di ricerca con tali query "linux split file at line". Pertanto, suggerirei di riaprire questa domanda, in modo che si possano aggiungere altre risposte preziose. O almeno creare un collegamento alla domanda più pertinente su SU.
Antoine Pinsard

Risposte:


178
file_name=test.log

# set first K lines:
K=1000

# line count (N): 
N=$(wc -l < $file_name)

# length of the bottom file:
L=$(( $N - $K ))

# create the top of file: 
head -n $K $file_name > top_$file_name

# create bottom of file: 
tail -n $L $file_name > bottom_$file_name

Inoltre, a pensarci bene, la divisione funzionerà nel tuo caso, poiché la prima divisione è più grande della seconda. Split mette il bilanciamento dell'input nell'ultima divisione, quindi

split -l 300000 file_name

uscirà xaacon 300k linee e xabcon 100k linee, per un input con 400k linee.


Grazie. ho trovato una domanda con risposta simile su superuser ie. usa la coda ecc. E sì, la divisione funzionerà con il mio esempio, ma non sempre il mio esempio è stato 100K.
denormalizer

2
Se stai provando a farlo su Windows e non vuoi usare Cygwin, questo progetto fornisce tutte le utilità
Jonathon Hill

15
Vorrei usare tail -n +L file_name > bottom_filedove semplicemente L=K+1senza la necessità di eseguire wcprima
Hashbrown

2
Preferisco usare sed -n '1,1000p' test.log > top_test.log ; sed '1,1000d' test.log > bottom_test.log. IHMO, questo è più semplice e non richiede il calcolo del numero totale di righe. Inoltre, funziona ancora se le righe sono state aggiunte tra l'esecuzione di ogni comando.
Antoine Pinsard

Per alcuni file questa risposta lascia una riga, ma la modifica suggerita da Hashbrown risolve il problema.
scharette
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.