¿Por qué mi archivo ordenado es más grande?

28

Tengo un archivo de texto de 2958616 bytes. Cuando ejecuto sort < file.txt | uniq > sorted-file.txt, obtengo un archivo de texto de 3213965 bytes. ¿Por qué mi archivo de texto ordenado es más grande?

Puede descargar los archivos de texto aquí .

wb9688
fuente
55
Su archivo de salida tiene \r\nterminaciones de línea, mientras que el archivo de entrada tiene \nterminaciones de línea. Tal vez debería configurar su configuración regional de manera diferente. Intenta LC_ALL=Cdelante de cada comando.
meuh
2
@meuh ¡Eso fue todo! ¿Podría agregar eso como respuesta?
wb9688
55
Espera, ¿la configuración regional afecta esto? ¿Qué localidad estás usando? ¿Cuál es el resultado de locale? ¿Estás seguro de que no creaste el archivo en otro sistema?
terdon
66
sed '/^[a-z]*$/d' < file.txt | wc -l me dio 305 líneas.
meuh
55
Su archivo también contiene â ê î ñ ô ö öö ûaquellos que no están en el conjunto ASCII.
terdon

Respuestas:

42

Mientras que su archivo original tiene líneas que terminan con \n, su archivo ordenado tiene \r\n. La adición de \res lo que cambia el tamaño.

Para ilustrar, esto es lo que sucede cuando ejecuto su comando en mi sistema Linux:

$ sort < file.txt | uniq > sorted-file.linux.txt
$ ls -l file.txt sorted-file.linux.txt 
-rw-r--r-- 1 terdon terdon 2958616 Jul 10 12:11 file.txt
-rw-r--r-- 1 terdon terdon 2942389 Jul 10 15:15 sorted-file.linux.txt
$ wc -l file.txt sorted-file.linux.txt 
273882 file.txt
271576 sorted-file.linux.txt

Como puede ver, el archivo deducido ordenado es unas pocas líneas más cortas y, en consecuencia, unos pocos bytes más pequeños. Su archivo, sin embargo, es diferente:

$ wc -l sorted-file.linux.txt sorted-file.txt 
271576 sorted-file.linux.txt
271576 sorted-file.txt

Los dos archivos tienen exactamente el mismo número de líneas, pero:

$ ls -l file.txt sorted-file.linux.txt sorted-file.txt 
-rw-r--r-- 1 terdon terdon 2958616 Jul 10 12:11 file.txt
-rw-r--r-- 1 terdon terdon 2942389 Jul 10 15:15 sorted-file.linux.txt
-rw-r--r-- 1 terdon terdon 3213965 Jul 10 12:11 sorted-file.txt

El sorted-file.txtque descargué de su enlace es más grande. Si ahora examinamos la primera línea, podemos ver el extra \r:

$ head -n1 sorted-file.txt | od -c
0000000   a  \r  \n
0000003

Que no están presentes en el que creé en Linux:

$ head -n1 sorted-file.linux.txt | od -c
0000000   a  \n
0000002

Si ahora eliminamos el \rarchivo de su archivo:

$ tr -d '\r' < sorted-file.txt > new-sorted-file.txt

Obtenemos el resultado esperado, un archivo que es más pequeño que el original, como el que creé en mi sistema:

$ ls -l sorted-file.linux.txt new-sorted-file.txt file.txt
-rw-r--r-- 1 terdon terdon 2958616 Jul 10 12:11 file.txt
-rw-r--r-- 1 terdon terdon 2942389 Jul 10 15:19 new-sorted-file.txt
-rw-r--r-- 1 terdon terdon 2942389 Jul 10 15:15 sorted-file.linux.txt
terdon
fuente
3
¿Cómo se agrega el comando de clasificación al archivo resultante? ¿No es la combinación de \ r plus \ na cosa de Windows?
Tulains Córdova
3
@ TulainsCórdova esa es una muy buena pregunta. No tengo idea. Supongo que el OP hizo esto en un entorno no nativo, pero no lo sé. Y sí, los \r\nfinales de línea son cosa de Windows.
terdon
25

hexdump lo revela!

$ hexdump -cn 32 file.txt 
0000000   a   d   h   d  \n   a   d   s   l  \n   a   m   v   b  \n   a
0000010   o   v  \n   a   o   w  \n   a   r   o   b  \n   a   s   f   a
0000020

$ hexdump -cn 32 my-sorted.txt 
0000000   a  \n   a   a  \n   a   a   a  \n   a   a   d  \n   a   a   d
0000010   s  \n   a   a   f   j   e  \n   a   a   f   j   e   s  \n   a
0000020 

$ hexdump -cn 32 sorted-file.txt 
0000000   a  \r  \n   a   a  \r  \n   a   a   a  \r  \n   a   a   d  \r
0000010  \n   a   a   d   s  \r  \n   a   a   f   j   e  \r  \n   a   a
0000020   

Su archivo ordenado es más grande porque usa terminaciones de línea de Windows \r\n(dos bytes) en lugar de terminaciones de línea de Linux \n(un byte).

¿Podría ser que estaba ejecutando ese comando anterior en Windows usando herramientas como cygwineste nuevo subsistema de Linux para Windows 10? ¿O tal vez corriste algo en Wine?

Byte Commander
fuente
Este nuevo subsistema de Windows para Linux ? bash es solo un programa de Linux que se ejecuta en él; ordenar no es bash.
user253751
@immibis ¿Te refieres al subsistema Linux para Windows ? Lo dije en serio, pero todavía no me ha interesado demasiado, así que no lo intenté ni investigé más hasta ahora.
Byte Commander
En realidad se llama el Subsistema de Windows para Linux , pero cualquiera de los dos tiene sentido. (Vea cómo se vería esto con otro subsistema: "Subsistema de Windows para consola [Aplicaciones]" o "Subsistema de consola [Aplicación] para Windows" tiene sentido)
user253751
@immibis Aha, está bien. Usted ve que todavía no estaba demasiado interesado en ese tema específico. Perdóname, por favor :)
Byte Commander