2013-01-23 16 views
61

मेरे पास दो फाइलें हैं (मान लें a.txt और b.txt), जिनमें से दोनों नामों की एक सूची है। मैं दोनों फाइलों पर sort चला चुका हूं।किसी फ़ाइल से लाइनें खोजें जो कि किसी अन्य फ़ाइल में मौजूद नहीं हैं

अब मैं a.txt से लाइनें ढूंढना चाहता हूं जो b.txt में मौजूद नहीं हैं।

(मैं इस प्रश्न के लिए जवाब खोजने के लिए समय के बहुत खर्च किया तो उसे संदर्भ के लिए दस्तावेजीकरण,),

उत्तर

101

आदेश आप का उपयोग करने के diff लेकिन comm

comm -23 a.txt b.txt 

डिफ़ॉल्ट रूप से नहीं है comm आउटपुट 3 कॉलम: बाएं-केवल, दाएं-केवल, दोनों-1, -2 और -3 स्विच इन कॉलम को दबाएं।

तो, -23, राइट केवल और दोनों कॉलम छुपाता लाइनों है कि केवल पहले (बाएं) फ़ाइल में दिखाई दिखा।

आपको लगता है कि दोनों में प्रदर्शित लाइनों को खोजने के लिए चाहते हैं, आप -12, जो बाएं केवल और राइट केवल कॉलम छुपाता उपयोग कर सकते हैं, बस दोनों स्तंभ के साथ छोड़।

+9

मैं जोड़ूंगा कि यह केवल तभी काम करता है जब दोनों फाइलें क्रमबद्ध हों। (मुझे पता है कि ओपी ने फाइलों को सॉर्ट किया है, लेकिन कई लोगों ने मुझे शामिल किया है, प्रश्न शीर्षक पढ़ा है और फिर उत्तर पर कूदें) – user247866

+1

@ user247866: सौभाग्य से कॉम आपको यह बताने के लिए बहुत दयालु है कि वे सॉर्ट नहीं किए गए हैं :) – marlar

20

सरल उत्तर मेरे लिए काम नहीं करता क्योंकि मुझे लाइन के लिए comm मैचों की लाइन का एहसास नहीं हुआ था, इसलिए एक फ़ाइल में डुप्लिकेट लाइनों को दूसरे में मौजूद नहीं होने के रूप में मुद्रित किया जाएगा। उदाहरण के लिए, यदि file1 निहित:

Alex 
Bill 
Fred 

और करें 2 निहित:

Alex 
Bill 
Bill 
Bill 
Fred 

फिर comm -13 file1 file2 उत्पादन होगा:

Bill 
Bill 

मेरे मामले में, मैं जानना चाहता था ही नहीं में हर स्ट्रिंग file2 फ़ाइल 1 में मौजूद है, इस पर ध्यान दिए बिना कि प्रत्येक फ़ाइल में कितनी बार पंक्ति आई थी।

समाधान 1: unix.stackexchange से (पहले "काम" जवाब मैंने पाया):

comm -13 <(sort -u file1) <(sort -u file2)

समाधान 2:-u (अद्वितीय) झंडा sort करने के लिए उपयोग

fgrep -v -f file1 file2

ध्यान दें कि अगर फ़ाइल 2 में डुप्ली है केट लाइन जो फ़ाइल 1, fgrep में मौजूद नहीं हैं, प्रत्येक डुप्लिकेट लाइनों को आउटपुट करेंगे।यह भी ध्यान रखें कि एकल (काफी बड़े) डेटासेट के लिए एक लैपटॉप पर मेरे पूरी तरह से गैर-वैज्ञानिक परीक्षण समाधान 1 (comm का उपयोग करके) समाधान 2 से लगभग 5 गुना तेज (fgrep का उपयोग करके) दिखाते हैं।

+0

I मेरी फाइलों को सॉर्ट किया गया था और uniq के माध्यम से पारित किया था। वैसे भी अन्य समाधानों के लिए धन्यवाद। – Sudar

2

मुझे यकीन नहीं है कि यह क्यों कहा गया है diff का उपयोग नहीं किया जाना चाहिए। मैं इसे दो फाइलों की तुलना करने के लिए उपयोग करता हूं और फिर बाएं फ़ाइल में मौजूद केवल लाइनों को आउटपुट करता हूं लेकिन सही में नहीं। इस तरह की लाइनों के साथ < तो यह लाइन

diff a.txt b.txt | grep \^\< 
+1

नई और अपरिवर्तित लाइनों के प्रिंटिंग को दबाने के लिए आप 'diff - new-line-format = --unchanged-line-format = a.txt b.txt' का उपयोग कर सकते हैं। –

3

मामले फ़ाइलों को अभी तक हल नहीं किया जाएगा में की शुरुआत में उस प्रतीक grep लिए पर्याप्त अंतर द्वारा चिह्नित किये जाते हैं, तो आप उपयोग कर सकते हैं:

comm -23 <(sort a.txt) <(sort b.txt) 
संबंधित मुद्दे