Tại sao tập tin được sắp xếp của tôi lớn hơn?


28

Tôi có một tệp văn bản 2958616 byte. Khi tôi chạy sort < file.txt | uniq > sorted-file.txt, tôi nhận được một tệp văn bản 3213965 byte. Tại sao tệp văn bản được sắp xếp của tôi lớn hơn?

Bạn có thể tải về các tập tin văn bản ở đây .


5
Tệp đầu ra của bạn có \r\nkết thúc dòng, trong khi tệp đầu vào có \nkết thúc dòng. Có lẽ bạn nên đặt miền địa phương của bạn khác nhau. Hãy thử LC_ALL=Ctrước mỗi lệnh.
meuh

2
@meuh Thế thôi! Bạn có thể thêm nó như là một câu trả lời?
wb9688

5
Đợi chút, địa phương có ảnh hưởng gì không? Bạn đang sử dụng ngôn ngữ nào? Đầu ra của localecái gì? Bạn có chắc chắn không tạo tệp trên một số hệ thống khác không?
terdon

6
sed '/^[a-z]*$/d' < file.txt | wc -l đã cho tôi 305 dòng.
meuh

5
Tệp của bạn cũng chứa â ê î ñ ô ö öö ûnhững thứ không có trong bộ ASCII.
terdon

Câu trả lời:


42

Trong khi tệp gốc của bạn có các dòng kết thúc bằng \n, tệp được sắp xếp của bạn có \r\n. Việc bổ sung \rlà những gì thay đổi kích thước.

Để minh họa, đây là những gì xảy ra khi tôi chạy lệnh của bạn trên hệ thống Linux của mình:

$ 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

Như bạn có thể thấy, tệp khử trùng được sắp xếp ngắn hơn một vài dòng và do đó, một vài byte nhỏ hơn. Tập tin của bạn, tuy nhiên, là khác nhau:

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

Hai tệp có cùng số dòng, nhưng:

$ 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

Cái sorted-file.txttôi tải về từ liên kết của bạn lớn hơn. Nếu bây giờ chúng ta kiểm tra dòng đầu tiên, chúng ta có thể thấy thêm \r:

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

Không có trong cái tôi tạo trên Linux:

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

Nếu bây giờ chúng tôi xóa \rtệp khỏi tệp của bạn:

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

Chúng tôi nhận được kết quả mong đợi, một tệp nhỏ hơn bản gốc, giống như tệp tôi đã tạo trên hệ thống của mình:

$ 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

3
Làm thế nào đến lệnh sắp xếp thêm \ r vào tệp kết quả? Không phải là sự kết hợp của \ r plus \ na Windows sao?
Tulains Córdova

3
@ TulainsCórdova đó là một câu hỏi rất hay. Tôi không có ý kiến. Tôi giả sử OP đã làm điều này trong một môi trường không phải là người bản địa nhưng tôi không biết. Và vâng, \r\nkết thúc dòng là một điều Windows.
terdon

25

hexdump tiết lộ nó

$ 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   

Tệp được sắp xếp của bạn lớn hơn vì nó sử dụng các kết thúc dòng Windows \r\n(hai byte) thay vì các kết thúc dòng Linux \n(một byte).

Có thể là bạn đang chạy lệnh đó ở trên trong Windows bằng cách sử dụng các công cụ như cygwinhoặc hệ thống con Linux mới này cho Windows 10? Hay bạn có thể chạy một cái gì đó trong Wine?


Hệ thống con Windows mới này cho Linux ? bash chỉ là một chương trình Linux chạy trong đó; sắp xếp không phải là bash.
dùng253751

@immibis Ý bạn là hệ thống con Linux cho Windows ? Ý tôi là vậy, nhưng bản thân tôi chưa quá quan tâm đến nó, nên đã không thử hoặc nghiên cứu thêm cho đến nay.
Chỉ huy Byte

Nó thực sự được gọi là Hệ thống con Windows cho Linux , nhưng một trong hai có ý nghĩa. (Xem giao diện của hệ thống con khác như thế nào: "Hệ thống con Windows cho Bảng điều khiển [Ứng dụng]" hoặc "Bảng điều khiển [Ứng dụng] Hệ thống con cho Windows" có ý nghĩa)
user253751

@immibis Aha, được thôi. Bạn thấy tôi chưa quá quan tâm đến chủ đề cụ thể đó. Xin hãy tha thứ cho tôi :)
Chỉ huy Byte
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.