Dividi un file in due


18

Ho un file di grandi dimensioni e devo dividerlo in due file. Supponiamo che nel primo file sia necessario selezionare le 1000 righe e inserirle in un altro file ed eliminare quelle righe nel primo file.

Ho provato a usare splitma sta creando più blocchi.


Hai controllato split --help?
Braiam,

Sì, l'ho verificato, ma sta creando più file che non mi servono.
Aravind,

Risposte:


30

Il modo più semplice è probabilmente di usare heade tail:

$ head -n 1000 input-file > output1
$ tail -n +1001 input-file > output2

Ciò inserirà le prime 1000 linee da input-filedentro output1e tutte le linee da 1001 fino alla fineoutput2


13

Penso che splitsia il tuo miglior approccio.

Prova a utilizzare l' -l xxxxopzione, dove xxxx è il numero di righe che desideri in ciascun file (il valore predefinito è 1000).

Puoi usare l' -n yyopzione se sei più preoccupato per la quantità di file creati. L'uso -n 2dividerà il file in solo 2 parti, indipendentemente dalla quantità di righe in ciascun file.

Puoi contare la quantità di righe nel tuo file con wc -l filename. Questo è il comando 'wordcount' con l'opzione righe.

Riferimenti

  • man split
  • man wc

1
Ecco come suddividere in un gruppo di file con un numero fisso di righe o come dividere uniformemente in un numero fisso di file. C'è un modo per dividere in un file di 1000 righe e un file con tutto il resto? Questo è quello che stava chiedendo; Non riuscivo a trovarlo nella pagina man
Michael Mrozek

Hai ragione Michael. Penso di aver preso una visione semplicistica della domanda. La tua soluzione è la migliore in questo caso. Un altro modo sarebbe usare il comando 'sed': sed -n 1.1000 originalfile> first_1000_lines. sed '1.1000d' file originale> rimanendo_line.
Lucien Raven,

Certo che potresti farlo split -l 1000 bigfile && mv xaa piece1 && cat x?? > piece2 && rm x??.
G-Man dice 'Reinstate Monica' il

8

Questo è un lavoro per csplit:

csplit -s infile 1001 

dividerà silentamente infile, il primo pezzo xx00- fino a, ma non includendo la linea 1001 e il secondo pezzo xx01- le linee rimanenti.
Puoi giocare con le opzioni se hai bisogno di nomi di file di output diversi, ad esempio usando -fe specificando un prefisso :

csplit -sf piece. infile 1001 

produce due file denominati piece.00epiece.01


Con una smart headpotresti anche fare qualcosa del tipo:

{ head -n 1000 > 1st.out; cat > 2nd.out; } < infile

1
Wow, davvero è un lavoro per csplit. Molto bella. (Sto solo leggendo l'elenco dei comandi POSIX e ho avuto enormi problemi a avvolgere la testa attorno allo csplitscopo del comando. All'inizio è davvero molto semplice.) :)
Wildcard

4

Un modo semplice per fare ciò che la domanda richiede, in un solo comando:

awk '{ if (NR <= 1000) print > "piece1"; else print > "piece2"; }' bigfile

o, per quelli di voi che odiano davvero digitare comandi lunghi e intuitivamente comprensibili,

awk '{ print > ((NR <= 1000) ? "piece1" : "piece2"); }' bigfile
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.