Dividir un archivo en dos

18

Tengo un archivo grande y necesito dividirlo en dos archivos. Suponga que en el primer archivo las 1000 líneas deben seleccionarse y colocarse en otro archivo y eliminar esas líneas en el primer archivo.

Intenté usarlo splitpero está creando múltiples fragmentos.

Aravind
fuente
¿Lo comprobaste split --help?
Braiam
Sí, lo he comprobado, pero está creando varios archivos que no es necesario para mí.
Aravind

Respuestas:

30

La forma más fácil es probablemente usar heady tail:

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

Eso colocará las primeras 1000 líneas desde input-fileadentro output1y todas las líneas desde 1001 hasta el final enoutput2

Michael Mrozek
fuente
13

Creo que ese splites tu mejor enfoque.

Intente usar la -l xxxxopción, donde xxxx es el número de líneas que desea en cada archivo (el valor predeterminado es 1000).

Puede usar la -n yyopción si le preocupa más la cantidad de archivos creados. El uso -n 2dividirá su archivo en solo 2 partes, sin importar la cantidad de líneas en cada archivo.

Puede contar la cantidad de líneas en su archivo con wc -l filename. Este es el comando 'wordcount' con la opción de líneas.

Referencias

  • man split
  • man wc
Lucien Raven
fuente
1
Así es como dividir en un grupo de archivos con un número fijo de líneas, o cómo dividir de manera uniforme en un número fijo de archivos. ¿Hay alguna manera de dividirse en un archivo de 1000 líneas y un archivo con todo lo demás? Eso es lo que estaba pidiendo; No pude encontrarlo en la página de manual
Michael Mrozek
Estás en lo correcto Michael. Creo que tomé una visión simplista sobre la cuestión. Su solución es la mejor en este caso. Otra forma sería utilizar el comando 'sed': sed -n 1,1000 originalfile> first_1000_lines. sed '1,1000d' archivo original> restantes_líneas.
Lucien Raven el
Por supuesto que puedes hacer split -l 1000 bigfile && mv xaa piece1 && cat x?? > piece2 && rm x??.
G-Man dice 'reinstalar a Monica' el
8

Este es un trabajo para csplit:

csplit -s infile 1001 

se sdividirá ilegítimamente infile, la primera pieza xx00- hasta pero sin incluir la línea 1001 y la segunda pieza xx01- las líneas restantes.
Puede jugar con las opciones si necesita diferentes nombres de archivos de salida, por ejemplo, usando -fy especificando un prefijo :

csplit -sf piece. infile 1001 

produce dos archivos nombrados piece.00ypiece.01


Con un smart headtambién podrías hacer algo como:

{ head -n 1000 > 1st.out; cat > 2nd.out; } < infile
don_crissti
fuente
1
Wow, realmente es un trabajo para csplit. Muy agradable. (Solo estoy leyendo la lista de comandos POSIX y tuve enormes problemas para csplitentender el propósito del comando al principio. Resulta que es realmente muy simple.) :)
Comodín el
4

Una manera simple de hacer lo que pide la pregunta, en un comando:

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

o, para aquellos de ustedes que realmente odian escribir comandos largos, intuitivamente comprensibles,

awk '{ print > ((NR <= 1000) ? "piece1" : "piece2"); }' bigfile
G-Man dice 'restablecer a Mónica'
fuente