Combina múltiples txts en uno

5

Estoy tratando de combinar varios txts en un archivo grande. Quiero que se pongan en orden, pero parece que esto no funciona correctamente.

En este momento intenté desde el terminal: cat *.txt >merged.txt pero esto parece concatenar los archivos al azar.

En mi carpeta tengo todos los archivos nombrados con números secuenciales (de 1.txt a 10000.txt). ¿Me estoy perdiendo algo?

    
pregunta KingBOB 11.10.2017 - 00:09

6 respuestas

10

Globbing no es aleatorio, está garantizado para ser alfabético (también conocido como orden lexicográfico según su localidad), que < a href="https://superuser.com/a/192355/156757"> es diferente del orden de clasificación numérico .

Puedes usar la expansión de llaves para esto. Reemplace '10' con el número del último archivo.

cat {1..10}.txt > merged.txt

Esto usa la expansión de refuerzo de bash, que puedes leer en LESS='+/Brace Expansion' man bash .

Tenga en cuenta que, a diferencia de los globos de archivo, la expansión de llave generará cadenas arbitrarias que no necesitan ser archivos existentes; en este caso, eso significa que obtendrá errores si faltan archivos en la secuencia (por ejemplo, si 7.txt no existe). Sin embargo, esto no afectará el contenido de merged.txt que se producirá como se esperaba.

    
respondido por el grg 11.10.2017 - 00:24
3

Use zsh con globos extendidos, y habilite la clasificación numérica de las expansiones de globos con el calificador (n) glob:

zsh -c 'cat *.txt(n) > merged.txt'

También puede ser más específico con sus globos, también:

zsh -c 'cat <1-10000>.txt(n) > merged.txt'

Consulte man zshexpn para obtener todos los detalles.

    
respondido por el Wildcard 11.10.2017 - 02:09
1

Heads up. Si los archivos están efectivamente numerados del 1 al 10000, entonces el sistema operativo está ordenando sus archivos en el orden del primer número: 1.txt 11.txt 12.txt ... 19.txt 100.txt ... 2.txt 20.txt 21.txt

etc.

Tendría que cambiar el nombre de los archivos como 00001, 00002, etc.

    
respondido por el equinoxe5 11.10.2017 - 00:17
1

Normalmente, no analiza la salida de ls , pero como sus nombres de archivo no contienen espacios en blanco o son "inusuales" personajes, podemos hacer esto:

shopt -s extglob
ls +([0-9]).txt | sort -n | xargs cat > merged.txt

El +([0-9]) es un bash patrón de globo extendido solo para coincidir uno o más números.

Con GNU ls (disponible a través de homebrew en el paquete coreutils)

ls -v +([0-9]).txt | xargs cat > merged.txt
    
respondido por el glenn jackman 11.10.2017 - 02:36
1

Otra posible respuesta podría ser:

ls | sort -n | xargs cat > merged.txt


En un sistema GNU / Linux puede hacer ls -v | xargs cat > merged.txt , pero esto es específico de la versión GNU de ls y no funciona para BSD ls .

    
respondido por el musicman523 11.10.2017 - 07:56
-4

En comando promt:
cd "ruta al directorio" (Enter)
copiar * .txt result.txt (Enter)

    
respondido por el Alex 11.10.2017 - 04:39

Lea otras preguntas en las etiquetas