मुश्किल से दो बड़ी पाठ फ़ाइलें


32

मेरे पास दो बड़ी फाइलें (6GB प्रत्येक) हैं। वे अनियंत्रित होते हैं, \nविभाजक के रूप में लाइनफीड ( ) के साथ। मैं उन्हें कैसे अलग कर सकता हूं? इसे 24 ह के तहत लेना चाहिए।

जवाबों:


45

सबसे स्पष्ट उत्तर केवल अंतर कमांड का उपयोग करने के लिए है और संभवतः इसके लिए --speed-large-files पैरामीटर को जोड़ना एक अच्छा विचार है।

diff --speed-large-files a.file b.file

आप बिना पढ़ी गई फ़ाइलों का उल्लेख करते हैं, इसलिए शायद आपको पहले फाइलों को क्रमबद्ध करना होगा

sort a.file > a.file.sorted
sort b.file > b.file.sorted
diff --speed-large-files a.file.sorted b.file.sorted

आप दूसरी तरह से डायरेक्ट आउटपुट को अलग से पाइप करके एक अतिरिक्त आउटपुट फाइल बनाने से बचा सकते हैं

sort a.file > a.file.sorted
sort b.file | diff --speed-large-files a.file.sorted -

जाहिर है ये बहुत सारे उपलब्ध मेमोरी वाले सिस्टम पर चलेंगे और आपको फ्री डिस्क स्पेस की भी बहुत जरूरत होगी।

यह आपके प्रश्न से स्पष्ट नहीं था कि क्या आपने पहले ये कोशिश की है। यदि ऐसा है तो यह जानना उपयोगी होगा कि क्या गलत हुआ (बहुत लंबा समय लगा)। मैंने हमेशा पाया है कि स्टॉक सॉर्ट और अलग-अलग कमांड कम से कम कस्टम कमांड्स को तब तक करते हैं जब तक कि फाइलों के कुछ बहुत ही डोमेन विशिष्ट गुण नहीं होते हैं जो चीजों को अलग तरीके से करना संभव बनाते हैं।


2
+1। आप नामित पाइप के साथ सभी अस्थायी फ़ाइलों को छोड़ सकते हैं। का प्रयोग करें mkfifoबनाने के लिए [ab].file.sortedउनके लिए आउटपुट के रूप में उपयोग करने से पहले sort। दोनों sortएस &को पृष्ठभूमि में रखें और दोनों पाइपों को फ़ाइनल के रूप में अलग-अलग उपयोग करें।
क्रिस्सी

15
@krissi तुम भी एक ही प्रभाव इस वाक्य के प्रयोग से कर सकते हैं:diff <(command 1) <(command 2)
माइकल Mrozek

धन्यवाद काम किया। मुझे एक जीबी मेमोरी की आवश्यकता थी, लेकिन एक 16GB अमेज़ॅन EC2 उदाहरण ने इसे तय कर दिया :)
जोनास

7
अगर मेरे जैसा कोई व्यक्ति आश्चर्य करता है कि <(cmd1) <(cmd2)वाक्य रचना क्यों काम करती है (जैसा कि मानक इनपुट को दो बार पुनर्निर्देशित करने जैसा लगता है!), कोशिश करें echo hello <(cmd1) <(cmd2)। आपको कुछ ऐसा दिखाई देगा, hello /dev/fd/63 /dev/fd/62जो अचानक स्पष्ट हो जाता है;)
एलेक्स

3
मेरे अनुभव में, --speed-large-filesयदि आपके पास पर्याप्त रैम नहीं है तो विकल्प मदद नहीं करता है। इसके अलावा, यदि आप एक बहु-पंक्ति रिकॉर्ड संरचना है जिसे आप संरक्षित करना चाहते हैं, तो पूर्व-छँटाई उपयोगी नहीं है। ऊपर दिए गए विकल्प (@unhammer द्वारा) दिलचस्प हैं, लेकिन इससे आउटपुट rdiffऔर bsdiffबाइनरी है। bdiffहिरलूम टूलबॉक्स से स्थापित करना एक चुनौतीपूर्ण कार्य की तरह लगता है (हीरूमल डेवटूल, विलुप्त हेडर फाइलें,…) की आवश्यकता होती है। क्या यह वास्तव में प्रयास के लायक है? क्या अन्य विकल्प हैं?
क्रिश्चियन पिसेट

5

diffइनपुट्स को क्रमबद्ध करना और प्रोग्राम को यह बताएं कि इनपुट्स क्रमबद्ध हैं, एक बड़े पैमाने पर गति प्रदान करेगा। मैं diffउस तरह के विकल्प के साथ किसी के बारे में नहीं जानता, लेकिन commहल इनपुट मानता है और यह बहुत तेज हो जाएगा अगर यह आपके उद्देश्यों के लिए पर्याप्त है।


commइसके लिए बहुत अच्छा काम किया, इसके बारे में पहले कभी नहीं सुना, लेकिन जाहिर तौर पर इसके कोरूटिल्स में।
theferrit32
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.