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.