Dividi un file in due file su una determinata riga


12

Sto cercando un modo in unix per dividere un file in due file a un determinato numero di riga.

split -l 100 file_nameè vicino a quello che sto cercando, ma questo comando crea più file, ciascuno di 100 righe. Sto cercando un comando per dividere un file in due file a un determinato numero di riga. C'è un modo per farlo in unix?

Risposte:


13

Una soluzione un po 'più stretta:

(head -100 > f1.txt; cat > f2.txt) < input.txt

1
Bella soluzione. Nessun conteggio wcprima e il file di input viene ancora elaborato una sola volta, come con la awksoluzione.
Dubu,

2
C'è una leggera possibilità che headleggerà più di solo 100 righe per trovare le prime 100 righe su cui produrre f1.txt; quei byte extra non saranno visti da cat.
Chepner,

Questo è così dannatamente lento
sdaffa23fdsf,

12

Utilizzare awk, quindi è necessario effettuare solo un passaggio nel file di input. Di seguito si presuppone che si desideri le prime 122 righe nel primo file e il resto nel secondo.

awk 'NR < 123 { print >> "top_file"; next } {print >> "bottom_file" }' file_name

Questo merita un pollice in alto. se vuoi dividere un file da X a Y, questo è il più semplice.
Glenn Plas,

Questa è la soluzione più semplice da capire. Ha funzionato come un incanto ... e mi fa pensare che dovrei spazzare via la polvere dal mio libro O'Reilly Sed & Awk che ho avuto dal 1999 o giù di lì, la sezione sed è ben letta, la sezione awk non così tanto.
Michael,

Questo è meglio della soluzione esclusa per il motivo @chepner menzionato nei commenti. Perderai i caratteri nel file 'f2.txt'. Questa soluzione è accurata ed efficiente. awk ftw.
Goran,

7

È possibile utilizzare heade tailper ottenere entrambe le parti:

head -n K file_name > top_file
tail -n L file_name > bottom_file

dove Kè il numero di riga ed Lè il numero di righe dal basso (numero totale di righe - K).

(puoi ottenere il numero totale di linee usando wc -l file_name).


5

È possibile utilizzare csplit(se disponibile) per farlo:

csplit file N+1

dividerà il file in due pezzi, un pezzo fino al (e incluso) numero di riga Ne l'altro pezzo dal numero di riga N+1fino all'ultima riga.
Se vuoi dividere per (ma non includere) il numero di riga N:

csplit file N

È grandioso! Grazie, ha risolto il problema perfettamente per me.
Zertrin,

Le migliori prestazioni per dividere il file da 20 GB in pezzi.
dr0i,

@ dr0i - non c'è da stupirsi, csplitè ottimizzato per questo lavoro.
don_crissti,

Dividendo un file di 200 milioni di righe ho ottenuto "memoria esaurita" usando un CSPLIT datato 2008. Usando CSPLIT datato 2011 funziona :)
dr0i

4

Entrambi heade tailhanno opzioni per produrre linee dall'estremità "altro" del file di quanto altrimenti farebbero. Quindi hai queste due opzioni:

head -n 100 source.txt > file1.txt
head -n -100 source.txt > file2.txt

oppure (dove NNN è 100 in meno dell'output di wc -l source.txt):

tail -n +NNN source.txt > file1.txt
tail -n NNN source.txt > file.txt

Puoi leggere le pagine del manuale per le tue versioni di heade tailper ulteriori informazioni.


0

Puoi usare 'wc', 'dc', 'head' e 'tail'. ie

unix> wc -l foo
545 /tmp/foo
unix> dc -e '545 100 - p'
445
unix> head -n 100 foo > filea
unix> tail -n 445 foo > fileb

Per facilità d'uso, puoi trasformare sopra in uno script di shell.

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.