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