यदि आपका लक्ष्य आम या असामान्य रेखाओं को ढूंढना है, तो comm
क्या मेरी आज्ञा यहाँ होगी।
यह दो फाइलों की तुलना करता है और तीन कॉलम दिखाता है- लाइनें जो कि फ़ाइल 1 के लिए अद्वितीय हैं, लाइनें जो कि फ़ाइल 2 के लिए अद्वितीय हैं और क्रमशः दोनों फ़ाइलों में दिखाई देने वाली लाइनें। आप इसे किसी भी आउटपुट को दबाने के लिए इसे झंडे पास कर सकते हैं। Eg comm -1 file1 file2
पहले कॉलम को दबाएगा, फ़ाइल 1 के लिए अद्वितीय चीजें। comm -12 file1 file2
दोनों फाइलों में केवल चीजें दिखाएगा।
एक बड़ा चेतावनी है: इनपुट को क्रमबद्ध किया जाना चाहिए। हम इसके आसपास काम कर सकते हैं।
यह आपको abc में वह सब कुछ दिखाएगा जो mno में नहीं है:
comm -23 <(sort abc.txt) <(sort mno.txt)
और आप wc -l
एक गिनती प्राप्त करने के लिए उसे पाइप कर सकते हैं ।
मेरे साथ जाने का कारण यह comm
है कि एक बार फाइलें छँट जाने के बाद, साइड-बाय-साइड तुलना कम्प्यूटेशनल रूप से वास्तव में सरल होती है। यदि आप इनमें से लाखों के साथ काम कर रहे हैं, तो इससे फर्क पड़ेगा।
यह कुछ नकली फाइलों के साथ प्रदर्शित किया जा सकता है। मेरे पास एक काफी तेज़ कंप्यूटर है इसलिए दृष्टिकोणों के बीच अंतर दिखाने के लिए, मुझे एक विशाल नमूना सेट की आवश्यकता है। मैं प्रति फ़ाइल 10 मिलियन 10-चार तार गया हूँ।
$ cat /dev/urandom | tr -dc '0-9' | fold -w 10 | head -10000000 > abc.txt
$ cat /dev/urandom | tr -dc '0-9' | fold -w 10 | head -10000000 > mno.txt
$ time comm -23 <(sort abc.txt) <(sort mno.txt) | wc -l
... 0m10.653s
$ time grep -Fcxv -f abc.txt mno.txt
... 0m23.920s
$ time grep -Fcwv -f abc.txt mno.txt
... 0m40.313s
$ time awk 'NR==FNR{a[$0]++};NR!=FNR && a[$0]' abc.txt mno.txt | wc -l
... 0m12.161s
छँटाई वह है जो मेरा अधिकांश समय लेती है। यदि हम दिखावा करते हैं कि abc.txt स्थिर है, तो हम इसे पूर्व-क्रमबद्ध कर सकते हैं और इससे भविष्य की तुलना बहुत तेज़ी से होती है:
$ sort abc.txt abc-sorted.txt
$ time comm -23 abc-sorted.txt <(sort mno.txt) | wc -l
... 0m7.426s
आप इन्हें देख सकते हैं और कुछ सेकंड के लिए अप्रासंगिक मान सकते हैं, लेकिन मुझे यह उजागर करना होगा कि ये एक उच्च अंत मशीन पर चल रहे हैं। यदि आप इसे (उदाहरण के लिए) रास्पबेरी पाई 3 पर करना चाहते हैं, तो आप बहुत धीमी टर्नआर्ड्स देख रहे होंगे और अंतर एक बिंदु तक बढ़ जाएगा जो वास्तव में मायने रखता है।
grep -cxvFf abc.txt mno.txt