uniq कमांड ठीक से काम नहीं कर रहा है?


22

तो मैं md5अपने आउटपुट के रूप में इस के साथ अपनी फ़ाइलों के हैश की जाँच कर रहा हूँ :

657cf4512a77bf47c39a0482be8e41e0  ./dupes2.txt
657cf4512a77bf47c39a0482be8e41e0  ./dupes.txt
8d60a927ce0f411ec94ac26a4785f749  ./derpina.txt
15f63928b8a1d5337137c38b5d66eed3  ./foo.txt
8d60a927ce0f411ec94ac26a4785f749  ./derp.txt

हालाँकि, find . -type f -exec md5sum '{}' ';' | uniq -w 33अद्वितीय हैश को खोजने के लिए दौड़ने के बाद मुझे यह मिला:

657cf4512a77bf47c39a0482be8e41e0  ./dupes2.txt
8d60a927ce0f411ec94ac26a4785f749  ./derpina.txt
15f63928b8a1d5337137c38b5d66eed3  ./foo.txt
8d60a927ce0f411ec94ac26a4785f749  ./derp.txt

मेरी समझ से, दोनों में से केवल एक को दिखाना चाहिए derpina.txtया derp.txtहोना चाहिए क्योंकि उनकी राख समान होती है। क्या मैं कुछ भूल रहा हूँ? क्या कोई मुझे बता सकता है कि यह इस तरह से आउटपुट क्यों करता है?


1
पता लगा लिया। जाहिरा तौर पर uniq दोहराया लाइनों का पता नहीं लगाता है जब तक कि वे आसन्न नहीं हैं। जवाब देने के लिए लिंक जिसने मुझे stackoverflow.com/questions/23114677/…
user2127726

जवाबों:


48

आपको sortपहले उपयोग करने की आवश्यकता है uniq:

find . -type f -exec md5sum {} ';' | sort | uniq -w 33

uniqकेवल बार-बार की रेखाओं को हटाता है। यह पुनरावृत्ति की तलाश में लाइनों को फिर से आदेश नहीं देता है। sortवह हिस्सा करता है

इसमें प्रलेखित है man uniq:

नोट: 'यूनीक' बार-बार लाइनों का पता नहीं लगाता है जब तक कि वे आसन्न न हों। आप पहले इनपुट को सॉर्ट करना चाहते हैं, या sort -u' withoutयूनीक का उपयोग करना चाहते हैं ।


uniqsort -uसभी सिस्टम में डिफ़ॉल्ट रूप से अलियास किया जाना चाहिए । अगर यह ठीक से काम करने के लिए हमेशा "सॉर्ट" की जरूरत है।
देवरूप

उस बदलाव से कुछ भ्रम कम होगा। दूसरी ओर, uniqकई सुविधाएँ उपलब्ध नहीं हैं sort -u। इसके अलावा, ऐसे मामले भी हैं जहां कोई uniqबिना उपयोग करना चाहता है sort
1910 में जॉन 1024

5

इनपुट uniqको क्रमबद्ध करने की आवश्यकता है। उदाहरण के मामले के लिए,

find . -type f -exec md5sum '{}' ';' | sort | uniq -w 33

काम करेगा। -w( --check-chars=N) लाइनों अद्वितीय केवल प्रथम स्तंभ के बारे में बनाता है; यह विकल्प इस मामले के लिए काम करता है। लेकिन इसके लिए लाइन के संबंधित भागों को निर्दिष्ट करने की संभावनाएं uniqसीमित हैं। उदाहरण के लिए, स्तंभ 4 की अनदेखी करते हुए कुछ कॉलम 3 और 5 पर काम करने का कोई विकल्प नहीं है।

आदेश sort में अद्वितीय आउटपुट लाइनों के लिए एक विकल्प होता है, और लाइनें छांटने के लिए उपयोग की जाने वाली कुंजियों के बारे में अद्वितीय होती हैं। इसका मतलब है कि हम शक्तिशाली कुंजी सिंटैक्स का उपयोग sortयह परिभाषित करने के लिए कर सकते हैं कि किस भाग में यूनीक होना चाहिए।

उदाहरण के लिए,

find . -type f -exec md5sum '{}' ';' | sort -k 1,1 -u

सिर्फ एक ही परिणाम देता है, लेकिन sortअन्य उपयोगों के लिए यह हिस्सा अधिक लचीला है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.