Почему мой отсортированный файл больше?

У меня есть 2 958 616-байтовый текстовый файл. Когда я работаю sort < file.txt | uniq > sorted-file.txt, Я получаю 3 213 965-байтовый текстовый файл. Почему мой отсортированный текстовый файл больше?

Можно загрузить текстовые файлы здесь.

28
задан 10 July 2016 в 07:20

2 ответа

В то время как Ваш исходный файл имеет строки, которые заканчиваются \n, Ваш отсортированный файл имеет \r\n. Добавление эти \r - то, что изменяет размер.

Для иллюстрирования вот то, что происходит, когда я выполняю команду в своей системе 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

, Как Вы видите, отсортированный дедуплицированный файл является несколькими строками короче и, следовательно, несколько меньших байтов. Ваш файл, однако, отличается:

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

Эти два файла имеют точно то же количество строк, но:

$ 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

Эти sorted-file.txt, тот, который я загрузил с Вашей ссылки, больше. Если мы теперь исследуем первую строку, мы видим дополнительное \r:

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

, Которые не присутствуют в том, который я создал на Linux:

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

, Если мы теперь удаляем \r из Вашего файла:

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

Мы получаем ожидаемый результат, файл, который меньше, чем оригинал, точно так же, как тот, который я создал в своей системе:

$ 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
42
ответ дан 23 November 2019 в 00:54

hexdump показывает его!

$ 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   

Ваш отсортированный файл больше, потому что он использует окончания строки Windows \r\n (два байта) вместо окончаний строки Linux \n (один байт).

могло случиться так выполнением той команды выше в соответствии с Windows с помощью или инструментов как cygwin или этой новой подсистемы Linux для Windows 10? Или Вы, возможно, выполняли что-то в Вине?

25
ответ дан 23 November 2019 в 00:54

Другие вопросы по тегам:

Похожие вопросы: