यूनीक इतना अनोखा कैसे नहीं है कि यूनीक भी है?


35

यहाँ pastebin से एक यादृच्छिक फ़ाइल पर कमांड हैं :

wget -qO - http://pastebin.com/0cSPs9LR | wc -l
350
wget -qO - http://pastebin.com/0cSPs9LR | sort -u | wc -l
287
wget -qO - http://pastebin.com/0cSPs9LR | sort | uniq | wc -l
287
wget -qO - http://pastebin.com/0cSPs9LR | sort | uniq -u | wc -l
258

-uझंडा क्या कर रहा है , इस पर मैन पेज स्पष्ट नहीं हैं। कोई सुझाव?


4
कोशिश करो सॉर्ट | uniq -d | wc -l और आप अंतर देख सकते हैं। :)
स्टॉफ

जवाबों:


42

लघु संस्करण:

  • uniq, बिना -u, आउटपुट की हर पंक्ति को विशिष्ट बनाता है ।
  • uniq -uकेवल इनपुट से प्रत्येक अद्वितीय रेखा प्रिंट करता है ।

थोड़ा लंबा संस्करण:

uniqउन फ़ाइलों से निपटने के लिए है जिनकी लाइनें डुप्लिकेट हैं, और केवल जब वे लाइनें इनपुट में क्रमिक रूप से दिखाई देती हैं। तो, इसके उद्देश्यों के लिए, एक अनूठी रेखा वह है जिसे तुरंत दोहराया नहीं जाता है।

( uniqएक बहुत ही सीमित अल्पकालिक मेमोरी है; यह कभी याद नहीं करेगा कि इनपुट में कोई रेखा पहले दिखाई दी थी, जब तक कि यह तुरंत पिछली पंक्ति नहीं थी - यही कारण uniqहै कि इसे अक्सर जोड़ा जाता है sort।)

जब यह uniqबिना डुप्लीकेट लाइनों के एक रन का सामना करता है , तो -uarg के बिना , उस लाइन की एक कॉपी प्रिंट करता है। (यह आउटपुट की हर पंक्ति को विशिष्ट बनाता है )।

इस -uतर्क के साथ , यह उस रेखा की शून्य प्रतियों को प्रिंट करता है - डुप्लिकेट के रन केवल आउटपुट से छोड़े जाते हैं।


1
मैं वास्तव में चाहता हूं कि छंटाई की आवश्यकता नहीं होने का विकल्प था। लेकिन इसे पूरी फ़ाइल को मेमोरी में रखने की आवश्यकता होगी (या यदि स्रोत एक सामान्य फ़ाइल है, तो हैश और ऑफ़सेट के साथ बहुत सी बहीखाते करना)
रैंडम 832

3
@ Random832: और यह तय करने की आवश्यकता होगी कि कौन सी चीज़ों को रखने के लिए (पहले, अंतिम, कुछ और, विन्यास योग्य), और यह निर्णय विश्व स्तर पर एल्गोरिदम को प्रभावित करेगा। परेशानी।
स्टीव जेसोप

1
@ Random832: यदि यह केवल वर्णों की संख्या के बारे में है, तो आप sort -uइसके बजाय उपयोग कर सकते हैं sort | uniq
ओलिवर

@oliver मैं कभी-कभी उन्हें पुनर्व्यवस्थित किए बिना किसी भी लाइन का पहला उदाहरण रखने की क्षमता चाहता था, और ऐसा करने के लिए लिखित स्क्रिप्ट।
रैंडम 832

1
@hvd: यदि आपका संस्करण uniqसामान्यीकरण और टकराव करता है, तो हाँ। लेकिन फिर भी यह केवल एक स्थानीय विचार है - आप जानते हैं कि छांटे गए आउटपुट में लाइन कहां दिखाई देगी, और बस चयन करने के लिए कई आसन्न लाइनों में से किसका चयन करना है। यदि इनपुट सॉर्ट नहीं किया गया है, तो निर्णय uniqifying के पूरे संचालन को प्रभावित करता है, उदाहरण के लिए यदि आप अंतिम डुप्लिकेट रखने जा रहे हैं तो आप तब तक कुछ भी आउटपुट नहीं कर सकते जब तक आप इनपुट की अंतिम पंक्ति नहीं पढ़ते ...
स्टीव जेसप

53

uniq-uकिसी भी रेखा को डुप्लिकेट करने वाली रेखाओं के साथ । इस प्रकार:

$ printf "%s\n" 1 1 2 3 | uniq
1
2
3
$ printf "%s\n" 1 1 2 3 | uniq -u
2
3

आमतौर पर, uniqलाइनों को एक बार सबसे अधिक प्रिंट करता है (क्रमबद्ध इनपुट मानकर)। यह विकल्प वास्तव में उन पंक्तियों को प्रिंट करता है जो वास्तव में अद्वितीय हैं (फिर से दिखाई नहीं दे रहे हैं)।


11
यह uniqकहा जा सकता है distinct, क्योंकि यह सभी विशिष्ट लाइनों को uniq -uप्रिंट करता है , जबकि सभी अद्वितीय लाइनों को प्रिंट करता है।
स्टीव जेसोप

यह कुछ लोकेल में GNU के साथ वास्तव में अद्वितीय नहीं है uniq
congonglm

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

18

uniq POSIX कल्पना स्पष्ट रूप से वर्णित:

-u
    Suppress the writing of lines that are repeated in the input.

-uविकल्प uniqदोहराया पंक्तियों को मुद्रित नहीं करने के लिए बनाते हैं।

अधिकांश uniqकार्यान्वयन बाइट्स तुलना का उपयोग करते हैं, जबकि जीएनयू uniqडुप्लिकेट लाइनों को फ़िल्टर करने के लिए कोलाज़ेशन ऑर्डर का उपयोग करते हैं। तो यह कुछ स्थानों में गलत परिणाम उत्पन्न कर सकता है, उदाहरण के लिए en_US.UTF-8स्थान:

$ printf '%b\n' '\U2460' '\U2461' | uniq
①

और -uआपको कोई रेखा नहीं दी:

$ printf '%b\n' '\U2460' '\U2461' | uniq -u
<blank>

तो आपको Cबाइट्स की तुलना करने के लिए लोकेल सेट करना चाहिए :

$ printf '%b\n' '\U2460' '\U2461' | LC_ALL=C uniq
①
②

3
ध्यान दें कि यहां जो गलत है, वह उतना नहीं है uniq(हालांकि जाहिर तौर पर POSIX का इरादा यह था कि वह स्ट्रॉकल () की तुलना में बाइट की तुलना sort -uउन) से करें, जो गलत तरीके से ① की तरह ही छांटते हैं । कम से कम GNU uniqके अनुरूप है sort -u
स्टीफन चेज़लस

@ स्टीफनचेलजैस - जहां कल्पना में यह स्पष्ट किया गया है?
मिकसेर

uniqस्ट्रोक के विरोध के रूप में मेम्कैंप / स्ट्रैम्प करने की आवश्यकता के बारे में , यह मेरे लिए बहुत स्पष्ट नहीं है लेकिन यह ज्योफ के लिए था । GNU स्थानों के बारे में the के समान ही छंटनी कर रहे हैं, यह स्पष्ट रूप से एक बग है क्योंकि कोई कारण नहीं है कि वे समान क्यों छाँटें। यह POSIX द्वारा अनुमत है, लेकिन कुछ बदलाव आ रहा है
स्टीफन चेज़लस

8

सामान्य:

echo "a b a b c c c" | tr ' ' '\n'
a
b
a
b
c
c
c

uniq: कोई दो बाद की दोहराई जाने वाली लाइनें

echo "a b a b c c c" | tr ' ' '\n' | uniq
a
b
a
b
c

क्रमबद्ध

echo "a b a b c c c" | tr ' ' '\n' | sort
a
a
b
b
c
c
c

सॉर्ट -यू: कोई दो दोहराए जाने वाली लाइनें

echo "a b a b c c c" | tr ' ' '\n' | sort -u
a
b
c

सॉर्ट / यूनीक: सभी अलग

echo "a b a b c c c" | tr ' ' '\n' | sort | uniq
a
b
c

अलग-अलग घटनाओं को गिनता है

echo "a b a b c c c" | tr ' ' '\n' | sort | uniq -c
2 a
2 b
3 c

केवल वे पंक्तियाँ जिन्हें दोहराया नहीं जाता (पहले क्रमबद्ध नहीं किया गया)

echo "a b a b c c c" | tr ' ' '\n' | uniq -u
a
b
a
b

केवल वे पंक्तियाँ जिन्हें दोहराया नहीं जाता (छँटने के बाद)

echo "a b a b c c c Z" | tr ' ' '\n' | sort | uniq -u
Z

uniq -d: केवल डुप्लिकेट लाइनें प्रिंट करें, प्रत्येक समूह के लिए एक

echo "a b a b c c c" | tr ' ' '\n' | uniq -d
c

.. गिना हुआ

echo "a b a b c c c" | tr ' ' '\n' | uniq -dc
3 c

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