ทำไมไฟล์ที่เรียงลำดับของฉันจึงใหญ่กว่า


28

ฉันมีไฟล์ข้อความ 2958616 ไบต์ เมื่อฉันรัน sort < file.txt | uniq > sorted-file.txtฉันจะได้รับไฟล์ข้อความขนาด 3213965 ไบต์ ทำไมไฟล์ข้อความที่เรียงลำดับของฉันจึงใหญ่กว่า

คุณสามารถดาวน์โหลดไฟล์ข้อความที่นี่


5
ไฟล์เอาต์พุตของคุณมีการ\r\nสิ้นสุดบรรทัดในขณะที่ไฟล์อินพุตมีการ\nสิ้นสุดบรรทัด บางทีคุณควรกำหนดสถานที่ของคุณแตกต่างกัน ลองLC_ALL=Cต่อหน้าแต่ละคำสั่ง
meuh

2
@meuh นั่นมัน! คุณสามารถเพิ่มคำตอบนั้นได้หรือไม่?
wb9688

5
รอบนสถานที่เกิดผลกระทบนี้ คุณกำลังใช้ภาษาอะไร ผลลัพธ์ของlocaleอะไร แน่ใจหรือไม่ว่าคุณไม่ได้สร้างไฟล์ในระบบอื่น?
terdon

6
sed '/^[a-z]*$/d' < file.txt | wc -l ให้ฉัน 305 สาย
meuh

5
ไฟล์ของคุณมีไฟล์â ê î ñ ô ö öö ûที่ไม่อยู่ในชุด ASCII
terdon

คำตอบ:


42

ในขณะที่ไฟล์ต้นฉบับของคุณมีเส้นสิ้นสุดที่มีไฟล์เรียงของคุณมี\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

3
ทำไมคำสั่ง sort จึงถูกเพิ่ม \ r ลงในไฟล์ผลลัพธ์ การรวมกันของ \ r plus \ na Windows ใช่หรือไม่
Tulains Córdova

3
@ TulainsCórdovaนั่นเป็นคำถามที่ดีมาก ฉันไม่รู้. ฉันสมมติว่า OP ทำสิ่งนี้ในสภาพแวดล้อมที่ไม่ใช่เจ้าของภาษา แต่ฉันไม่รู้ และใช่การ\r\nสิ้นสุดบรรทัดเป็นสิ่งที่ Windows
terdon

25

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 หรือคุณอาจจะทำอะไรบางอย่างในไวน์?


ระบบย่อย Windowsใหม่สำหรับ Linuxหรือไม่ bash เป็นโปรแกรม Linux เพียงโปรแกรมเดียวที่ทำงานอยู่ การจัดเรียงไม่ได้เป็นทุบตี
user253751

@immibis คุณหมายถึงระบบย่อย Linux สำหรับ Windows ? ฉันหมายความว่า แต่ยังไม่ได้สนใจมันมากเกินไปดังนั้นจึงไม่ได้ลองหรือค้นคว้าเพิ่มเติมอีก
ผู้บัญชาการไบต์

จริงๆแล้วมันเรียกว่าระบบย่อยของ Windows สำหรับ Linuxแต่อย่างใดอย่างหนึ่งที่เหมาะสม (ดูว่าสิ่งนี้จะมีลักษณะอย่างไรกับระบบย่อยอื่น: "ระบบย่อย Windows สำหรับคอนโซล [แอปพลิเคชัน]" หรือ "คอนโซล [แอปพลิเคชัน] ระบบย่อยสำหรับ Windows" เข้าท่า)
user253751

@immibis Aha โอเค คุณเห็นฉันยังไม่สนใจในหัวข้อเฉพาะนั้น ยกโทษให้ฉันโปรด :)
Byte บัญชาการ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.