Digamos, tengo un comando command
que imprime una gran cantidad de líneas para stdout:
line1
line2
.....
lineN
Quiero guardar la salida en el disco, pero no como un solo archivo, sino como una secuencia de archivos, cada uno con 1000 líneas de stdout:
file0001.txt:
-------------
line1
....
line1000
file0002.txt:
-------------
line1001
....
line2000
etc
Traté de buscar en Google la respuesta, pero cada vez que Google me indica que tee
ordene, lo cual es inútil en esta situación. Probablemente, estoy ingresando consultas incorrectas.
fuente
split [arguments...] [input e.g. "-" for stdin] [output_prefix]
, por ejemplo:tar -c somedir | split --byes 100MB --numeric-suffixes --suffix-length=3 - somedir.tar.part-
generaría un montón de archivos de 100 MB llamadossomedir.tar.part-000
001, 002 y así sucesivamente.Puedes usar un script bash
lines.bash
y úsalo como:
cat long_file.txt | bash lines.bash
El único problema que noté es con el
*
inicio de sesiónlong_file.txt
(alguien podría corregirlo).fuente
IFS
cadena vacía para evitar la división de palabrasread
. Se usa-r
para deshabilitar la barra invertida que se escaparead
. Eliminar-e
para evitar que la barra invertida se escapeecho
. Use comillas para evitar la división de palabrasecho
. Utilice-v
enbash
desde 4,0 a evitar el inicio de una sub-proceso. Utilice el incremento posterior ya que su código actual pondrá en el primer archivo solo 999 líneas.a=0; while IFS='' read -r line; do printf -v filename "%04d.txt" $((a++/1000)); echo "$line" >> "$filename"; done
printf
no tiene-v
interruptor. (bash 4.2.10
) Al menos no está en la página deprintf
man printf
documentos / usr / bin / printf, que nunca en la vida podrían establecer una variable de entorno. Consultehelp printf
la documentación delprintf
shell incorporado.++/
todavía hay un error de sintaxis en la parte.