Pourquoi mon fichier trié est-il plus grand?

28

J'ai un fichier texte de 2958616 octets. Lorsque j'exécute sort < file.txt | uniq > sorted-file.txt , je reçois un fichier texte de 3213965 octets. Pourquoi mon fichier texte trié est-il plus grand?

Vous pouvez télécharger les fichiers texte ici .

    
posée wb9688 10.07.2016 - 12:05
la source

2 réponses

42

Bien que votre fichier d'origine comporte des lignes qui se terminent par \n , votre fichier trié contient \r\n . L'ajout du \r est ce qui change la taille.

Pour illustrer, voici ce qui se passe lorsque je lance votre commande sur mon système 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

Comme vous pouvez le constater, le fichier trié de manière dédoublée est plus court et, par conséquent, de quelques octets plus petit. Votre fichier est cependant différent:

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

Les deux fichiers ont exactement le même nombre de lignes, mais:

$ 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

Le sorted-file.txt , celui que j'ai téléchargé depuis votre lien, est plus grand. Si nous examinons maintenant la première ligne, nous pouvons voir le \r supplémentaire:

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

Qui ne sont pas présents dans celui que j'ai créé sous Linux:

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

Si nous supprimons maintenant le \r de votre fichier:

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

Nous obtenons le résultat escompté, un fichier plus petit que l'original, tout comme celui que j'ai créé sur mon système:

$ 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
    
réponse donnée terdon 10.07.2016 - 14:21
la source
25

hexdump le révèle!

$ 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   

Votre fichier trié est plus gros car il utilise les fins de ligne Windows \r\n (deux octets) au lieu des fins de ligne Linux \n (un octet).

Se pourrait-il que vous exécutiez cette commande sous Windows en utilisant des outils tels que cygwin ou ce nouveau sous-système Linux pour Windows 10? Ou avez-vous peut-être lancé quelque chose dans Wine?

    
réponse donnée Byte Commander 10.07.2016 - 14:22
la source

Lire d'autres questions sur les étiquettes