2012-05-07 20 views
8

मेरे पास दो फाइलें ए और बी हैं। मैं ए में सभी लाइनों को ढूंढना चाहता हूं जो बी में नहीं हैं। मानक लिनक्स उपयोगिताओं का उपयोग करके इसे करने का सबसे तेज़ तरीका क्या है? यहां मैंने अभी तक कोशिश की है:दो फाइलों के सेट अंतर को कैसे ढूंढें?

for line in `cat file1` 
do 
    if [ `grep -c "^$line$" file2` -eq 0]; then 
    echo $line 
    fi 
done 

यह काम करता है, लेकिन यह धीमा है। क्या ऐसा करने का कोई तेज तरीका है?

+0

क्या आप संभवतः कुछ कोड दिखा सकते हैं या समझा सकते हैं कि आपने क्या प्रयास किया है? आपका प्रश्न यह खड़ा है कि ऐसा लगता है कि आप चाहते हैं कि हम आपके लिए सभी काम करें। अक्सर, कोड दिखाने से अधिक उत्तरों, और बेहतर परिणाम प्रोत्साहित करने में मदद मिलेगी। – jmort253

+0

आपको यह भी परिभाषित करना चाहिए कि आप "सबसे तेज़" से क्या अपेक्षा करते हैं। यह समय प्रसंस्करण, या कोड लिखने में बिताए समय के बारे में है। दूसरे के लिए, मैं 'diff ए बी' जैसे कुछ के लिए जाना होगा grep '^ -' ' – tonio

+0

@ jmort253, धन्यवाद, मैंने अधिक जानकारी जोड़ने के लिए प्रश्न संपादित किया – spinlok

उत्तर

20

The BashFAQdescribes doing exactly this with comm, जो धर्मविधान सही तरीका है। के रूप में यह बजाय व्यक्तिगत लाइनों की तुलना में ब्लॉक पर काम करने की कोशिश करता

# Subtraction of file1 from file2 
# (i.e., only the lines unique to file2) 
comm -13 <(sort file1) <(sort file2) 

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

कम एसयूएस 2 (1 99 7) के बाद part of the Single Unix Specification रहा है।

+0

यह वही है जो मैं ढूंढ रहा था! धन्यवाद! – spinlok

+0

एक आसान कार्यक्रम है। मैंने पहले उसे नहीं देखा है। मुझे आश्चर्य है कि शेल अनुप्रयोगों के अन्य छोटे रत्न जो कि मेरे पिछले जीवन को सिसडमिन के रूप में याद करते थे। –

1

'diff' प्रोग्राम मानक यूनिक्स प्रोग्राम है जो फ़ाइलों के बीच अंतर को देखता है।

% cat A 
a 
b 
c 
d 
% cat B 
a 
b 
e 
% diff A B 
3,4c3 
< c 
< d 
--- 
> e 
एक सरल ग्रेप साथ

और बी में नहीं काट एक एक में लाइनों का चयन कर सकते हैं ध्यान दें कि कटौती नहीं बल्कि साधारण है और लाइनों में रिक्त स्थान इसे बंद कर फेंक ... लेकिन अवधारणा नहीं है।

% diff A B | grep '^<' | cut -f2 -d" " 
c 
d 
2

आप बस लाइनों है कि फाइल A में हैं चाहते हैं, लेकिन B में नहीं, तो आप फ़ाइलों को क्रमबद्ध, और उन्हें diff के साथ तुलना कर सकते हैं।

sort A > A.sorted 
sort B > B.sorted 
diff -u A.sorted B.sorted | grep '^-' 
+4

आपको इसके लिए अस्थायी फ़ाइलों की आवश्यकता नहीं है। 'diff <(क्रम ए) <(क्रमबद्ध बी) | grep '^ -' ' – jordanm

+0

हां, यह इस तरह से भी स्पष्ट है, धन्यवाद – tonio