Por que meu arquivo classificado é maior?

28

Eu tenho um arquivo de texto de 2958616 bytes. Quando executo sort < file.txt | uniq > sorted-file.txt , recebo um arquivo de texto de 3213965 bytes. Por que meu arquivo de texto classificado é maior?

Você pode baixar os arquivos de texto aqui .

    
por wb9688 10.07.2016 / 12:05

2 respostas

42

Enquanto o seu arquivo original tiver linhas que terminam com \n , seu arquivo classificado terá \r\n . A adição do \r é o que altera o tamanho.

Para ilustrar, eis o que acontece quando executo seu comando no meu 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 você pode ver, o arquivo desclassificado classificado é algumas linhas mais curtas e, conseqüentemente, alguns bytes menores. Seu arquivo, no entanto, é diferente:

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

Os dois arquivos têm exatamente o mesmo número de linhas, mas:

$ 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

O sorted-file.txt , o que baixei do seu link, é maior. Se agora examinarmos a primeira linha, podemos ver o \r extra:

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

Que não estão presentes no que eu criei no Linux:

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

Se agora removermos o \r do seu arquivo:

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

Obtemos o resultado esperado, um arquivo menor que o original, como o que eu criei no meu 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
    
por terdon 10.07.2016 / 14:21
25

hexdump revela isso!

$ 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   

Seu arquivo classificado é maior porque usa as terminações de linha do Windows \r\n (dois bytes) em vez dos finais de linha do Linux \n (um byte).

Poderia ser que você estava executando o comando acima no Windows usando ferramentas como cygwin ou este novo subsistema Linux para Windows 10? Ou você talvez tenha alguma coisa no Wine?

    
por Byte Commander 10.07.2016 / 14:22