Tengo un archivo de texto plano grande (por número de líneas) que me gustaría dividir en archivos más pequeños, también por número de líneas. Entonces, si mi archivo tiene alrededor de 2M líneas, me gustaría dividirlo en 10 archivos que contengan 200k líneas, o 100 archivos que contengan 20k líneas (más un archivo con el resto; ser igualmente divisible no importa).
Podría hacer esto con bastante facilidad en Python, pero me pregunto si hay algún tipo de forma ninja de hacer esto usando bash y unix utils (en lugar de bucle manual y recuento / partición de líneas).
cat part* > original
Respuestas:
¿Has mirado el comando dividir?
Podrías hacer algo como esto:
que creará archivos cada uno con 200000 líneas llamadas
xaa xab xac
...Otra opción, dividida por el tamaño del archivo de salida (todavía se divide en saltos de línea):
crea archivos como
output_prefix01 output_prefix02 output_prefix03 ...
cada uno de tamaño máximo de 20 megabytes.fuente
split -b 200m filename
(m para megabytes, k para kilobytes o sin sufijo para bytes)-d
opción no está disponible en OSX, usegsplit
en su lugar. Espero que esto sea útil para los usuarios de Mac.¿Qué tal el comando dividir ?
fuente
Sí, hay un
split
comando. Dividirá un archivo por líneas o bytes.fuente
split -l 1000000 train_file train_file.
y en el mismo directorio obtendrétrain_file.aa
el primer millón, luegotrail_file.ab
el próximo millón, etc.split input my/dir/
.utilizar
split
Syntax split [options] [INPUT [PREFIX]]
http://ss64.com/bash/split.html
fuente
Utilizar:
Aquí, 1 y 100 son los números de línea que capturará
output.txt
.fuente
split
como todas las respuestas principales aquí ya le dicen.dividir el archivo "file.txt" en archivos de 10000 líneas:
fuente
split
(de GNU coreutils, desde la versión 8.8 del 2010-12-22 ) incluye el siguiente parámetro:Por lo tanto,
split -n 4 input output.
generará cuatro archivos (output.a{a,b,c,d}
) con la misma cantidad de bytes, pero las líneas pueden estar divididas en el medio.Si queremos preservar las líneas completas (es decir, divididas por líneas), esto debería funcionar:
Respuesta relacionada: https://stackoverflow.com/a/19031247
fuente
En caso de que solo desee dividir por x número de líneas cada archivo, las respuestas dadas sobre
split
están bien. Pero, tengo curiosidad por saber que nadie prestó atención a los requisitos:No puedo hacer eso sin "wc + cut", pero estoy usando eso:
Esto se puede agregar fácilmente a sus funciones bashrc para que pueda invocarlo pasando nombres de archivo y fragmentos:
En caso de que desee solo x fragmentos sin resto en un archivo adicional, simplemente adapte la fórmula para sumarlo (fragmentos - 1) en cada archivo. Utilizo este enfoque porque generalmente solo quiero x número de archivos en lugar de x líneas por archivo:
Puede agregar eso a un script y llamarlo su "estilo ninja", porque si nada satisface sus necesidades, puede construirlo :-)
fuente
-n
opción desplit
.también puedes usar awk
fuente
awk -v lines=200000 -v fmt="%d.txt" '{print>sprintf(fmt,1+int((NR-1)/lines))}'
HDFS getmerge archivo pequeño y derramado en el tamaño de la propiedad.
Este método provocará un salto de línea.
Intento fusionarme y dividirme en aproximadamente 128 MB por archivo.
fuente