2009-04-14 20 views
13

मेरे पास एक ऐसा टूल है जो परीक्षण उत्पन्न करता है और आउटपुट की भविष्यवाणी करता है। विचार यह है कि अगर मुझे विफलता है तो मैं भविष्यवाणी की तुलना वास्तविक आउटपुट से कर सकता हूं और देख सकता हूं कि वे कहां अलग हो गए हैं। समस्या यह है कि वास्तविक आउटपुट में कुछ पंक्तियां होती हैं, जो diff को भ्रमित करती हैं। मैं डुप्लिकेट को हटाना चाहता हूं, ताकि मैं उन्हें आसानी से तुलना कर सकूं। असल में, sort -u जैसे कुछ लेकिन सॉर्टिंग के बिना।यूनिक्स उपकरण फ़ाइल से डुप्लिकेट लाइनों को हटाने के लिए

क्या कोई यूनिक्स कमांडलाइन उपकरण है जो यह कर सकता है?

+0

की संभावित डुप्लिकेट [मैं यूनिक्स में एक फ़ाइल में डुप्लिकेट लाइनों कैसे हटा सकता हूँ?] (Http://stackoverflow.com/questions/1444406/how-can-i-delete-duplicate-lines-in- ए-फाइल-इन-यूनिक्स) –

उत्तर

18

uniq(1)

SYNOPSIS

uniq [विकल्प] ... [इनपुट [आउटपुट]]

वर्णन

त्यागें सभी लगातार समान लाइनों में से एक है, लेकिन INPUT (या मानक इनपुट) से, OUTPUT (या मानक आउटपुट) पर लिखना।

या, आप गैर आसन्न डुप्लिकेट लाइनों को दूर करने के साथ ही चाहते हैं, पर्ल के इस टुकड़ा यह करना होगा:

while(<>) { 
    print $_ if (!$seen{$_}); 
    $seen{$_}=1; 
} 
+0

पर्ल उत्तर केवल तभी काम करता है जब आप पहली वस्तु चाहते हैं। अंतिम एक अलग समाधान होगा। – Xetius

+1

और उन लोगों के लिए जो पर्ल का उपयोग करने के बारे में नहीं जानते हैं, यह सब आपको टाइप करने की आवश्यकता है: perl -pe 'प्रिंट जब तक $ {$ _} ++' [INPUT]> OUTPUT – reinierpost

+0

@Xetuis, वे ' एक ही पंक्ति फिर से करें :) यदि आप अंतिम पंक्ति चाहते हैं, तो बस लाइन संख्या में देखी गई प्रविष्टि सेट करें, लूप में प्रिंट न करें, फिर अंत में लाइन नंबर के क्रम में उन्हें प्रिंट करें। लेकिन मुझे नहीं लगता कि इस मामले में यह निहित है। –

1

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

यदि आप सभी डुप्लिकेट लाइनों को हटाना चाहते हैं, न केवल निकटवर्ती वाले, तो यह ट्रिकियर है।

1

यहां मैं क्या जवाब दे रहा था, जबकि मैं यहां एक उत्तर का इंतजार कर रहा था (हालांकि पहला (और स्वीकार्य) उत्तर लगभग 2 मिनट में आया था)। मैं VIM में इस प्रतिस्थापन प्रयोग किया है:

%s/^\(.*\)\n\1$/\1/ 

जिसका मतलब है: लाइनों जहां न्यू लाइन के बाद हम पहले की तरह ही है के लिए देखो, और उन्हें केवल क्या हम पहली पंक्ति में कब्जा के साथ बदलें।

uniq हालांकि, निश्चित रूप से आसान है।

24

uniq उत्तर के लिए पूरक, जो आपके काम को पहले sort पर ध्यान नहीं देते हैं, तो यह बहुत अच्छा काम करता है। आप गैर आसन्न लाइनों को हटाने के लिए की जरूरत है (या आप अपनी फ़ाइल उलटफेर के बिना डुप्लिकेट निकालना चाहते हैं), तो निम्न पर्ल एक लाइनर यह करना चाहिए (here से चोरी हो):

cat textfile | perl -ne '$H{$_}++ or print' 
+0

मुझे लगता है कि यह एक साफ जवाब है। लगभग 6 वर्षों के लिए पर्ल में प्रोग्रामिंग किया गया था और कुछ संक्षिप्त – Xetius

+1

के बारे में सोचा नहीं होगा पर्ल हिस्सा वास्तव में निफ्टी है। हालांकि, यह "बिल्ली के बेकार उपयोग" पुरस्कार के लिए अर्हता प्राप्त करता है :-) (http://partmaps.org/era/unix/award.html देखें)। अंत में बस " sleske

+2

मैंने कभी उस पुरस्कार के बारे में नहीं सुना होगा! हाँ, मैं कभी-कभी बिल्ली का उपयोग मुफ्त में करता हूं; मुझे नहीं पता कि क्यों "बिल्ली x |" मुझे " वाई "मेरी आंखें खून बहती है: पी –

1

यहाँ एक awk कार्यान्वयन है , पर्यावरण को परेशान/अनुमति नहीं है (अभी तक एक नहीं देखा है)! पीएस: यदि एक से अधिक डुप्लिकेट लाइनें हैं, तो यह डुप्लिकेट आउटपुट प्रिंट करता है।

awk '{ 

# Cut out the key on which duplicates are to be determined. 
key = substr($0,2,14) 

#If the key is not seen before, store in array,else print 
if (! s[key]) 
    s[key] = 1; 
else 
    print key; 
}' 
+4

यदि आप पूरी लाइन को केवल कुंजी के रूप में देख रहे हैं, तो यह perl समाधानों के समान है: 'awk'! C [$ 0] ++ 'file' –

संबंधित मुद्दे