Sıralı dosyam neden daha büyük?


28

Ben bir 2958616 bayt metin dosyası var. Çalıştığımda sort < file.txt | uniq > sorted-file.txt3213965 baytlık bir metin dosyası alıyorum. Sıralı metin dosyam neden daha büyük?

Metin dosyalarını buradan indirebilirsiniz .


5
Çıktı dosyanızın \r\nsatır sonları varken, girdi dosyanızın \nsatır sonları vardır. Belki de yerel ayarlarınızı farklı şekilde ayarlamalısınız. LC_ALL=CHer komutun önünde deneyin .
— meuh

2
@meuh Bu oydu! Bunu bir cevap olarak ekler misiniz?
— wb9688,

5
Bekle, yerel bunu etkiliyor mu? Hangi yerel ayarı kullanıyorsunuz? Çıktı nedir locale? Dosyayı başka bir sistemde oluşturmadığınızdan emin misiniz?
— terdon

6
sed '/^[a-z]*$/d' < file.txt | wc -l Bana 305 satır verdi.
— meuh

5
Dosyanız ayrıca â ê î ñ ô ö öö ûASCII setinde bulunmayanları da içerir .
— terdon

Yanıtlar:


42

Orijinal dosyanızda biten satırlar olsa da \n, sıralanmış dosyanızda var \r\n. Bunun \rboyutu ne değiştirirse.

Açıklamak gerekirse, emrinizi Linux sistemimde çalıştırdığımda ne olur:

$ 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

Gördüğünüz gibi, sıralanan çözülmüş dosya birkaç satır daha kısa ve sonuç olarak birkaç bayt daha küçük. Ancak dosyanız farklıdır:

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

İki dosya aynı sayıda satıra sahiptir, ancak:

$ 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

Bağlantınızdan sorted-file.txtindirdiğim dosya daha büyük. Şimdi ilk satırı incelersek, ekstraları görebiliriz \r:

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

Linux'ta yarattığımda bulunmayanlar:

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

Şimdi \rdosyayı dosyanızdan kaldırırsak :

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

Beklenen sonucu, sistemimde yarattığım gibi orijinalden daha küçük bir dosya elde ediyoruz:

$ 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 komutu neden sonuç dosyasına eklendi? \ R artı \ na Windows olayı birleşimi değil mi?
— Tulains Córdova

3
@ TulainsCórdova bu çok iyi bir soru. Hiç bir fikrim yok. OP'nin yerel olmayan bir ortamda yaptığını farz ediyorum ama bilmiyorum. Ve evet, \r\nsatır sonları bir Windows şeydir.
— terdon

25

hexdump onu ortaya koyuyor!

$ 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   

Sıralanan dosyanız daha büyük çünkü \r\nLinux satır sonları \n(bir bayt) yerine Windows satır sonlarını (iki bayt) kullanıyor .

Bu komutu Windows altında çalışan ya cygwinda Windows 10 için bu yeni Linux alt sistemini ya da araçlarını kullanarak çalıştırıyor olabilir miydiniz ? Yoksa Wine'da bir şey mi çalıştırdın?


Linux için bu yeni Windows Alt Sistemi ? bash, içinde çalışan yalnızca bir Linux programıdır; sıralama bash değil.
— user253751

@ immibis Windows için Linux alt sistemini mi kastediyorsunuz ? Bunu kastettim, ama henüz kendimle fazla ilgilenmedim, o zamana kadar daha fazla araştırma yapmadım.
— Byte Commander

Aslında Linux için Windows Alt Sistemi olarak adlandırılıyor , ancak ikisi de bir anlam ifade ediyor. (Bunun başka bir alt sistemle nasıl göründüğüne bakın: "Konsol için Windows Alt Sistemi [Uygulamalar]" veya "Windows için Konsol [Uygulama] Alt Sistemi" anlamlıdır)
— user253751 11:16

@ immibis Aha, tamam. Görüyorsun ki o konuya henüz fazla ilgi duymadım. Affet beni, lütfen :)
— Byte Commander
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.