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* > originalRespuestas:
¿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)-dopción no está disponible en OSX, usegspliten su lugar. Espero que esto sea útil para los usuarios de Mac.¿Qué tal el comando dividir ?
fuente
Sí, hay un
splitcomando. Dividirá un archivo por líneas o bytes.fuente
split -l 1000000 train_file train_file.y en el mismo directorio obtendrétrain_file.aael primer millón, luegotrail_file.abel próximo millón, etc.split input my/dir/.utilizar
splitSyntax 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
splitcomo 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
splitestá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
-nopció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