किसी फ़ाइल की सभी पंक्तियाँ अद्वितीय हैं


11

मेरे पास एक टेक्स्ट फाइल है जिसमें इस तरह की लाइनें हैं:

This is a thread  139737522087680
This is a thread  139737513694976
This is a thread  139737505302272
This is a thread  139737312270080
.
.
.
This is a thread  139737203164928
This is a thread  139737194772224
This is a thread  139737186379520

मैं हर पंक्ति की विशिष्टता के बारे में कैसे सुनिश्चित हो सकता हूं?

नोट: लक्ष्य फ़ाइल का परीक्षण करना है, न कि इसे संशोधित करना यदि डुप्लिकेट लाइनें मौजूद हैं।


1
: में लिंक करने unix.stackexchange.com/q/76049/117549
जेफ स्कालर

1
क्या आप जांचना चाहते हैं कि क्या सभी लाइनें अद्वितीय हैं, या क्या आप कोई डुप्लिकेट निकालना चाहते हैं?
8bittree

1
@ 8bittree - इच्छा बस सुनिश्चित विशिष्टता होने के लिए
SNR

जवाबों:


24
[ "$(wc -l < input)" -eq "$(sort -u input | wc -l)" ] && echo all unique

वास्तव में मैंने क्या कहा होगा, सिवाय uniqइसकेsort -u
नोनी मोस

1
यदि इनपुट पहले से सॉर्ट नहीं किया गया है, uniqतो एक बड़ी गलती होगी; यह केवल आसन्न रेखाओं को काट देता है!
एलेक्सिस

1
यदि कोई अपराधियों में दिलचस्पी रखता है, तो एक sort <file> | uniq -dडुप्लिकेट को प्रिंट करेगा।
रॉल्फ

25

अजीब समाधान:

awk 'a[$0]++{print "dupes"; exit(1)}' file && echo "no dupes"

4
+1 स्वीकार किए गए उत्तर को पूरी फ़ाइल में दो बार पढ़ा जाता है, जबकि जैसे ही यह एक रीड में डुप्लिकेट लाइन का सामना करता है, वैसे ही रुक जाता है। यह पाइप किए गए इनपुट के साथ भी काम करेगा, जबकि दूसरी ज़रूरतों के लिए इसे दोबारा पढ़ा जा सकता है।
जोएल

आप भगाओ नहीं किया जा सका echoमें END?
इग्नासियो वाज़केज़-अब्राम्स

2
@ इग्नासियोवेज़ज़-एब्स वास्तव में प्रतिध्वनि का कोई मतलब नहीं है। करना && echoया || echoउत्तर में यह बताना कि एक कमांड एक्ज़िट स्टेटस कोड के साथ सही काम करता है। महत्वपूर्ण बात यह है exit(1)। आदर्श रूप में, आप इस तरह का उपयोग करेंगे if has_only_unique_lines file; then ..., नहीं if [[ $(has_only_unique_lines file) = "no dupes" ]]; then ..., कि मूर्खतापूर्ण होगा।
JoL

2
जहाँ अन्य उत्तर मेमोरी को सेव करने के लिए फाइल को दो बार पढ़ते हैं, यह पूरी फाइल को मेमोरी में पढ़ेगा, यदि कोई डुप्लिकेट नहीं है।
Kusalananda

1
@ कुसलानंद जबकि यह पूरी फाइल को मेमोरी में पढ़ेगा जब कोई sortभी डुप्लिकेट नहीं होगा , का उपयोग करेगा, भले ही कोई डुप्लिकेट हो या नहीं, ठीक है? कैसे बचती है स्मृति?
JoL

21

का उपयोग कर sort/ uniq:

sort input.txt | uniq

केवल डुप्लिकेट लाइनों के लिए जाँच -dकरने के लिए uniq के लिए विकल्प का उपयोग करें । यह केवल ऐसी लाइनें दिखाएगा जो डुप्लिकेट हैं, यदि कोई नहीं तो यह कुछ भी नहीं दिखाएगा:

sort input.txt | uniq -d

यह मेरा गोटो है। निश्चित नहीं है कि दूसरे, उच्च मत वाले उत्तर क्या प्रदान करते हैं जो यह नहीं करता है।
user1717828

1
यह डुप्लिकेट को हटाने के लिए अच्छा विकल्प है।
एसएनआर

1
यह वह नहीं करता है जो वह चाहता है। वह जानना चाहता है कि क्या डुप्लिकेट हैं, उन्हें नहीं हटाएं।
बारमर

@ बरमार: जबकि ऐसा लगता है कि सवाल अभी भी अस्पष्ट है। साथ ही ओपी टिप्पणी को स्पष्ट करने का प्रयास करते हैं।
jesse_b

एक लंबित संपादन है जो अधिक स्पष्टीकरण जोड़ता है।
बारमर

5

TLDR

मूल प्रश्न अस्पष्ट था, और पढ़ा कि ओपी को केवल एक फ़ाइल की सामग्री का एक अनूठा संस्करण चाहिए था। वह नीचे दिखाया गया है। सवाल के अद्यतन रूप में, ओपी अब यह कह रहा है कि वह केवल यह जानना चाहता है कि फ़ाइल की सामग्री अद्वितीय है या नहीं।


परीक्षण करें कि फ़ाइल की सामग्री अद्वितीय है या नहीं

आप यह sortसत्यापित करने के लिए उपयोग कर सकते हैं कि कोई फ़ाइल अद्वितीय है या इसमें डुप्लिकेट हैं जैसे:

$ sort -uC input.txt && echo "unique" || echo "duplicates"

उदाहरण

कहो कि मेरे पास ये दो फाइलें हैं:

डुप्लिकेट नमूना फ़ाइल
$ cat dup_input.txt
This is a thread  139737522087680
This is a thread  139737513694976
This is a thread  139737505302272
This is a thread  139737312270080
This is a thread  139737203164928
This is a thread  139737194772224
This is a thread  139737186379520
अद्वितीय नमूना फ़ाइल
$  cat uniq_input.txt
A
B
C
D

अब जब हम इन फ़ाइलों का विश्लेषण करते हैं तो हम बता सकते हैं कि क्या वे अद्वितीय हैं या उनमें डुप्लिकेट हैं:

परीक्षण डुप्लिकेट फ़ाइल
$ sort -uC dup_input.txt && echo "unique" || echo "duplicates"
duplicates
अद्वितीय फ़ाइल का परीक्षण करें
$ sort -uC uniq_input.txt && echo "unique" || echo "duplicates"
unique

मूल प्रश्न (फ़ाइल की अनूठी सामग्री)

बस के साथ किया जा सकता है sort:

$ sort -u input.txt
This is a thread  139737186379520
This is a thread  139737194772224
This is a thread  139737203164928
This is a thread  139737312270080
This is a thread  139737505302272
This is a thread  139737513694976
This is a thread  139737522087680

3

मैं आमतौर sortपर फाइल करता हूं , फिर uniqडुप्लिकेट की संख्या गिनने के लिए उपयोग करता हूं, फिर मैं sortएक बार सूची के नीचे डुप्लिकेट देखता हूं ।

मैंने आपके द्वारा दिए गए उदाहरणों में एक डुप्लिकेट जोड़ा:

$ sort thread.file | uniq -c | sort
      1 This is a thread  139737186379520
      1 This is a thread  139737194772224
      1 This is a thread  139737203164928
      1 This is a thread  139737312270080
      1 This is a thread  139737513694976
      1 This is a thread  139737522087680
      2 This is a thread  139737505302272

चूंकि मैंने uniqकुछ समय के लिए मैन पेज नहीं पढ़ा है, इसलिए मैंने किसी भी विकल्प के लिए त्वरित रूप से देखा। निम्नलिखित दूसरे प्रकार की आवश्यकता को समाप्त करता है, यदि आप केवल डुप्लिकेट देखना चाहते हैं:

$ sort thread.file | uniq -d
This is a thread  139737505302272

यह वास्तव में एक अच्छा विकल्प है। #rez
SNR

2

यदि कोई डुप्लिकेट नहीं हैं, तो सभी लाइनें अद्वितीय हैं:

[ "$(sort file | uniq -d)" ] && echo "some line(s) is(are) repeated"

विवरण: लगातार दोहराई जाने वाली लाइनों को बनाने के लिए फ़ाइल लाइनों को क्रमबद्ध करें (सॉर्ट करें)
लगातार सभी लाइनों को निकालें जो समान (uniq -d) हैं।
यदि ऊपर कमांड ( [...]) का कोई आउटपुट है , तो ( &&) एक संदेश प्रिंट करें।


2

यह एक पर्ल जवाब के बिना पूरा नहीं होगा!

$ perl -ne 'print if ++$a{$_} == 2' yourfile

यह प्रत्येक गैर-अद्वितीय पंक्ति को एक बार प्रिंट करेगा: इसलिए यदि यह कुछ भी प्रिंट नहीं करता है, तो फ़ाइल में सभी अद्वितीय लाइनें हैं।


1

का उपयोग कर cmpऔर sortमें bash:

cmp -s <( sort file ) <( sort -u file ) && echo 'All lines are unique'

या

if cmp -s <( sort file ) <( sort -u file )
then
    echo 'All lines are unique'
else
    echo 'At least one line is duplicated'
fi

यह फ़ाइल को दो बार सॉर्ट करेगा, हालांकि स्वीकृत उत्तर की तरह।

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