मेरी सॉर्ट की गई फ़ाइल बड़ी क्यों है?


28

मेरे पास 2958616 बाइट टेक्स्ट फाइल है। जब मैं दौड़ता हूं sort < file.txt | uniq > sorted-file.txt, तो मुझे एक 3213965 बाइट टेक्स्ट फाइल मिलती है। मेरी सॉर्ट की गई टेक्स्ट फ़ाइल बड़ी क्यों है?

आप यहां पाठ फ़ाइलों को डाउनलोड कर सकते हैं


5
आपकी आउटपुट फ़ाइल में \r\nलाइन एंडिंग्स हैं, जबकि इनपुट फ़ाइल में \nलाइन एंडिंग्स हैं। शायद आपको अपना लोकेल अलग तरह से सेट करना चाहिए। LC_ALL=Cप्रत्येक कमांड के सामने प्रयास करें ।
meuh

2
@meuh यही था! क्या आप इसे उत्तर के रूप में जोड़ सकते हैं?
wb9688

5
रुको, लोकेल इसे प्रभावित करता है? आप किस लोकेल का उपयोग कर रहे हैं? का आउटपुट क्या है locale? क्या आप वाकई किसी अन्य सिस्टम पर फ़ाइल नहीं बना रहे हैं?
टेराडॉन

6
sed '/^[a-z]*$/d' < file.txt | wc -l मुझे 305 लाइनें दीं।
meuh

5
आपकी फ़ाइल में â ê î ñ ô ö öö ûवे ASCII सेट भी नहीं हैं।
टेराडॉन

जवाबों:


42

जबकि आपकी मूल फ़ाइल में ऐसी पंक्तियाँ होती हैं जो \nआपकी अंतिम फ़ाइल के साथ होती हैं \r\n। इसके अतिरिक्त \rजो आकार बदलता है।

यह बताने के लिए, कि जब मैं अपने लिनक्स सिस्टम पर आपकी कमांड चलाता हूं, तो यहां क्या होता है:

$ 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

लिनक्स में मेरे द्वारा बनाए गए में मौजूद नहीं हैं:

$ 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
परिणामी फ़ाइल में सॉर्ट कमांड add \ r कैसे आता है? \ R plus \ na Windows चीज का संयोजन नहीं है?
ट्यूलेंस कोर्डोवा

3
@ TulainsCórdova यह एक बहुत अच्छा सवाल है। मुझे पता नहीं है। मैं मान रहा हूं कि ओपी ने गैर-देशी वातावरण में ऐसा किया है, लेकिन मुझे नहीं पता। और हां, \r\nलाइन एंडिंग एक विंडोज चीज है।
टेराडॉन

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   

आपकी सॉर्ट की गई फ़ाइल बड़ी है क्योंकि यह \r\nलिनक्स लाइन एंडिंग \n(एक बाइट) के बजाय विंडोज लाइन एंडिंग (दो बाइट्स) का उपयोग करती है ।

क्या ऐसा हो सकता है कि आप cygwinविंडोज 10 के लिए या तो इस नए लिनक्स सबसिस्टम जैसे टूल का उपयोग करके विंडोज के नीचे उस कमांड को चला रहे थे ? या आप शायद शराब में कुछ चला रहे थे?


लिनक्स के लिए यह नया विंडोज सबसिस्टम ? बैश केवल एक लिनक्स प्रोग्राम है जो इसमें चलता है; सॉर्ट बैश नहीं है।
user253751

@immibis आप विंडोज के लिए लिनक्स सबसिस्टम का मतलब है ? मेरा मतलब है कि, लेकिन अभी तक इसमें खुद भी दिलचस्पी नहीं ली है, इसलिए इसे अभी तक आगे बढ़ाने या शोध करने की कोशिश नहीं की है।
बाइट कमांडर

यह वास्तव में लिनक्स के लिए विंडोज सबसिस्टम कहलाता है , लेकिन या तो एक समझ में आता है। (देखें कि यह किस प्रकार एक अन्य सबसिस्टम के साथ दिखेगा: या तो "कंसोल के लिए विंडोज सबसिस्टम [एप्लीकेशन]" या "कंसोल [एप्लीकेशन] विंडोज के लिए सबसिस्टम" समझ में आता है)
user253751

@ मिनीबिस अहा, ठीक है। आप देखें कि मैं अभी तक उस विशिष्ट विषय में बहुत दिलचस्पी नहीं ले रहा था। माफ कर दो मुझे, कृपया :)
बाइट कमांडर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.