Tengo un archivo xml de 150 GB que me gustaría acortar (es decir, truncar) a aproximadamente 1 GB: ¿puedo usar un comando simple (bash o similar) o debo seguir la ruta programática (editándolo en vi o emacs es una pesadilla incluso en grandes sistemas de hierro)?
(No estoy particularmente preocupado por la pérdida de información, quiero un archivo más corto para poder probar una pieza de software al respecto y no esperar muchas horas por la respuesta, un archivo más corto me permitirá hacerlo).
bash
unix
file-management
adrianmcmenamin
fuente
fuente

Respuestas:
Suponiendo que desea truncar y extraer el primer 1 GB del archivo de 150 GB:
Con
head:head -c 1G infile > outfileTenga en cuenta que el
Gsufijo puede reemplazarseGBpara alinearse con 1000 en lugar de 1024.O con
dd:dd if=infile of=outfile bs=1M count=1024O como en Wumpus Q. La respuesta de Wumbley,
ddpuede truncarse en su lugar.fuente
Para truncar un archivo a 1 gigabyte, use el
truncatecomando:El resultado del truncamiento probablemente no será un archivo XML válido, pero supongo que lo comprende.
La documentación para la versión GNU de
truncateestá aquí y la documentación para la versión BSD está aquífuente
Siempre que sea posible, usaría el
truncatecomando como en la respuesta de John1024. Sin embargo, no es un comando estándar de Unix, por lo que es posible que algún día no puedas usarlo. En ese caso, tambiénddpuede hacer un truncamiento en el lugar.ddEl comportamiento predeterminado es truncar el archivo de salida en el punto donde finaliza la copia, por lo que solo debe darle un archivo de entrada de longitud 0 y decirle que comience a escribir en el punto de truncamiento deseado:(Esto no es lo mismo que copiar y truncar
dden la respuesta de multithr3at3d).Tenga en cuenta que usé 1048576 y 1024 porque 1048576 * 1024 es el tamaño deseado. Evité bs = 1m porque se trata de una respuesta "portabilidad", y clásicos
ddsólo sabe sufijosk,byw.fuente
bsnúmero multiplicado por elseeknúmero es el número de bytes que se deben mantener. Cualquier dos números que satisfagan esa restricción deberían funcionar; por ejemplo,bs=1073741824 seek=1obs=1 seek=1073741824. O, dado que el valorbspredeterminado es 512,seek=2097152solo también debería funcionar. Y puede utilizar la notación como1M,1K,1Gy2M.No estoy completamente seguro de lo que estás preguntando. ¿Solo quiere deshacerse de los otros 149 GB o está tratando de comprimir 150 GB en 1 GB? Independientemente, este puede ser un método útil para lograr esto.
El
splitcomando puede dividir cualquier archivo en varias partes. Ver hombre dividido . Puede especificar el tamaño de los fragmentos de archivo en los que desea dividirlo con la-bopción. Por ejemplo:$ split -b 1GB myfile.xml
Sin ninguna otra opción, esto debería crear varios archivos en el directorio actual comenzando con la letra
x. Si desea ajustar los nombres de los archivos divididos, consulte la página del manual.Para volver a ensamblar el archivo simplemente use
cat * > re-assembled.xml.Ejemplo:
fuente
Puedes usar el
splitcomando.Para más detalles, eche un vistazo a esta respuesta de stackoverflow
fuente
Al final solo solía
sedextraer un número arbitrario de líneas:fuente
sed 1000000q(y un poco más compacto, visualmente hablando).