texto tablas hacer formularios formulario ejemplos ejemplo como cajas boton atributos bash file unix

bash - tablas - input html



¿Cómo dividir un archivo de texto grande en archivos más pequeños con igual número de líneas? (10)

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; no importa si es divisible de manera uniforme).

Podría hacer esto con bastante facilidad en Python, pero me pregunto si hay alguna forma de ninja para hacerlo usando bash y unix utils (en lugar de hacer un bucle manual y contar / crear líneas de partición).


¿Has mirado la orden de división?

$ split --help Usage: split [OPTION] [INPUT [PREFIX]] Output fixed-size pieces of INPUT to PREFIXaa, PREFIXab, ...; default size is 1000 lines, and default PREFIX is `x''. With no INPUT, or when INPUT is -, read standard input. Mandatory arguments to long options are mandatory for short options too. -a, --suffix-length=N use suffixes of length N (default 2) -b, --bytes=SIZE put SIZE bytes per output file -C, --line-bytes=SIZE put at most SIZE bytes of lines per output file -d, --numeric-suffixes use numeric suffixes instead of alphabetic -l, --lines=NUMBER put NUMBER lines per output file --verbose print a diagnostic to standard error just before each output file is opened --help display this help and exit --version output version information and exit

Podrías hacer algo como esto:

split -l 200000 filename

que creará archivos cada uno con 200000 líneas llamadas xaa xab xac ...

Otra opción, dividida por tamaño del archivo de salida (todavía se divide en saltos de línea):

split -C 20m --numeric-suffixes input_filename output_prefix

crea archivos como output_prefix01 output_prefix02 output_prefix03 ... cada uno de tamaño máximo de 20 megabytes.


¿Qué tal el comando de split ?

split -l 200000 mybigfile.txt


En caso de que solo quiera dividir por x número de líneas en cada archivo, las respuestas proporcionadas sobre la split están bien. Pero, tengo curiosidad por que nadie haya prestado atención a los requisitos:

  • "Sin tener que contarlos" -> usando wc + cut
  • "tener el resto en un archivo extra" -> split lo hace por defecto

No puedo hacer eso sin "wc + cut", pero estoy usando eso:

split -l $(expr `wc $filename | cut -d '' '' -f3` / $chunks) $filename

Esto se puede agregar fácilmente a sus funciones básicas para que solo pueda invocarlo pasando el nombre de archivo y los fragmentos:

split -l $(expr `wc $1 | cut -d '' '' -f3` / $2) $1

En caso de que desee solo x trozos sin resto en un archivo adicional, simplemente adapte la fórmula para sumarla (trozos - 1) en cada archivo. Utilizo este enfoque porque generalmente solo quiero x cantidad de archivos en lugar de x líneas por archivo:

split -l $(expr `wc $1 | cut -d '' '' -f3` / $2 + `expr $2 - 1`) $1

Puedes agregar eso a un script y llamarlo tu "forma ninja", porque si nada satisface tus necesidades, puedes crearlo :-)


HDFS getmerge pequeño archivo y derramado en tamaño de propiedad.

Este método causará salto de línea

split -b 125m compact.file -d -a 3 compact_prefix

Intento obtener y dividir en aproximadamente 128 MB cada archivo.

dividido en 128m, la unidad de tamaño del juez es M o G, por favor haga una prueba antes de usar

begainsize=`hdfs dfs -du -s -h /externaldata/$table_name/$date/ | awk ''{ print $1}'' ` sizeunit=`hdfs dfs -du -s -h /externaldata/$table_name/$date/ | awk ''{ print $2}'' ` if [ $sizeunit = "G" ];then res=$(printf "%.f" `echo "scale=5;$begainsize*8 "|bc`) else res=$(printf "%.f" `echo "scale=5;$begainsize/128 "|bc`) # celling ref http://blog.csdn.net/naiveloafer/article/details/8783518 fi echo $res # split into $res files with number suffix. ref http://blog.csdn.net/microzone/article/details/52839598 compact_file_name=$compact_file"_" echo "compact_file_name :"$compact_file_name split -n l/$res $basedir/$compact_file -d -a 3 $basedir/${compact_file_name}


Sí, hay un comando de split . Se dividirá un archivo por líneas o bytes.

$ split --help Usage: split [OPTION]... [INPUT [PREFIX]] Output fixed-size pieces of INPUT to PREFIXaa, PREFIXab, ...; default size is 1000 lines, and default PREFIX is `x''. With no INPUT, or when INPUT is -, read standard input. Mandatory arguments to long options are mandatory for short options too. -a, --suffix-length=N use suffixes of length N (default 2) -b, --bytes=SIZE put SIZE bytes per output file -C, --line-bytes=SIZE put at most SIZE bytes of lines per output file -d, --numeric-suffixes use numeric suffixes instead of alphabetic -l, --lines=NUMBER put NUMBER lines per output file --verbose print a diagnostic just before each output file is opened --help display this help and exit --version output version information and exit SIZE may have a multiplier suffix: b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024, GB 1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.


Utilizar:

sed -n ''1,100p'' filename > output.txt

Aquí, 1 y 100 son los números de línea que capturará en output.txt .


divide el archivo "file.txt" en archivos de 10000 líneas:

split -l 10000 file.txt


también puedes usar awk

awk -vc=1 ''NR%200000==0{++c}{print $0 > c".txt"}'' largefile


usar split

Dividir un archivo en partes de tamaño fijo, crea archivos de salida que contienen secciones consecutivas de INPUT (entrada estándar si no se da ninguna o INPUT es `- '')

Syntax split [options] [INPUT [PREFIX]]

http://ss64.com/bash/split.html


split (de GNU coreutils, desde la versión 8.8 de 2010-12-22 ) incluye el siguiente parámetro:

-n, --number=CHUNKS generate CHUNKS output files; see explanation below CHUNKS may be: N split into N files based on size of input K/N output Kth of N to stdout l/N split into N files without splitting lines/records l/K/N output Kth of N to stdout without splitting lines/records r/N like ''l'' but use round robin distribution r/K/N likewise but only output Kth of N to stdout

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 se pueden dividir en el medio.

Si queremos conservar líneas completas (es decir, divididas por líneas), esto debería funcionar:

split -n l/4 input output.

Respuesta relacionada: https://.com/a/19031247