डेटा को सॉर्ट किए बिना केवल अद्वितीय परिणाम कैसे प्राप्त करें?


40
$ cat data.txt 
aaaaaa
aaaaaa
cccccc
aaaaaa
aaaaaa
bbbbbb
$ cat data.txt | uniq
aaaaaa
cccccc
aaaaaa
bbbbbb
$ cat data.txt | sort | uniq
aaaaaa
bbbbbb
cccccc
$

परिणाम जो मुझे चाहिए वह है कि फाइल में स्टेटमेंट के मूल क्रम को बनाए रखते हुए सभी डुप्लिकेट्स (न सिर्फ लगातार वाले) को हटाते हुए मूल फाइल से सभी लाइनों को प्रदर्शित करें

यहाँ, इस उदाहरण में, मैं वास्तव में जिस परिणाम की तलाश कर रहा था

aaaaaa
cccccc
bbbbbb

मैं uniqसामान्य रूप से यह सामान्यीकृत ऑपरेशन कैसे कर सकता हूं ?

जवाबों:


54
perl -ne 'print unless $seen{$_}++' data.txt

या, यदि आपके पास एक बेकार उपयोगcat होना चाहिए :

cat data.txt | perl -ne 'print unless $seen{$_}++'

यहाँ एक awkअनुवाद है, ऐसे सिस्टम के लिए जिनमें पर्ल की कमी है:

awk '!seen[$0]++' data.txt
cat data.txt | awk '!seen[$0]++'

3
थोड़ी छोटी { if (!seen[$0]++) print }
जागृत

1
जब तक आपकी फ़ाइल वास्तव में बहुत बड़ी नहीं है, तब तक संस्करण या तो इसे चलाने के लिए टाइप करने में अधिक समय लेता है।
cjm

8
Awk संस्करण बाहर छोड़ कर भी कम किया जा सकता है if, print:, कोष्ठक, और ब्रेसिज़awk '!seen[$0]++'
गॉर्डन Davisson

2
@ देखें, यह उस सरणी का नाम है जिसमें हम अपनी देखी गई प्रत्येक पंक्ति को रिकॉर्ड कर रहे हैं। आप इसे '!LarryWall[$0]++'सभी जागृत कारों के लिए बदल सकते हैं , लेकिन "देखा" लोगों को कार्यक्रम को बेहतर ढंग से समझने में मदद करता है।
cjm

1
@ सादी, कि वास्तव में एक प्रश्न के रूप में पूछा जाना चाहिए था, टिप्पणी नहीं। लेकिन उस फ़ाइल की कुछ पंक्तियाँ एक स्थान पर समाप्त होती हैं, और कुछ नहीं। ये कमांड पूरी लाइन को महत्वपूर्ण मानते हैं, जिसमें व्हाट्सएप भी शामिल है।
cjm

13

जॉन के पास एक उपकरण है unique:

usr@srv % cat data.txt | unique out
usr@srv % cat out
aaaaaa
cccccc
bbbbbb

एकल कमांडलाइन में अतिरिक्त टूल के बिना समान प्राप्त करने के लिए थोड़ा अधिक जटिल है:

usr@srv % cat data.txt | nl | sort -k 2 | uniq -f 1 | sort -n | sed 's/\s*[0-9]\+\s\+//'
aaaaaa
cccccc
bbbbbb

nlलाइनों के सामने प्रिंट संख्याएँ, इसलिए यदि हम sort/ uniqउनके पीछे, हम लाइनों के मूल क्रम को पुनर्स्थापित कर सकते हैं। sedबस बाद में लाइन नंबर हटाता है;)


क्या सामान्य लिनक्स कमांड्स का कोई संयोजन है जो ऐसा कर सकता है?
लेज़र

7
"डेटा को सॉर्ट किए बिना" में आपको क्या याद आया?
टोटर

@Totor - एक ही टिप्पणी के लिए मेनकस का जवाब देखें । @binfalse - आपका दूसरा समाधान काम नहीं करता है (हो सकता है कि यह इस तुच्छ नमूने के साथ काम करता है लेकिन यह कुछ वास्तविक जीवन इनपुट के साथ काम नहीं करता है)। कृपया इसे ठीक करें, जैसे कि यह हमेशा काम करना चाहिए:nl -ba -nrz data.txt | sort -k2 -u | sort | cut -f2
डॉन_क्रिस्टी

6

मैं इसका उपयोग करना पसंद करता हूं:

cat -n data.txt | sort --key=2.1 -b -u | sort -n | cut -c8-

cat -n लाइन नंबर जोड़ता है,

sort --key=2.1 -b -u दूसरे फ़ील्ड पर सॉर्ट करें (अतिरिक्त पंक्ति संख्याओं के बाद), प्रमुख रेखाओं को अनदेखा करते हुए, अद्वितीय रेखाओं को रखते हुए

sort -n सख्त अंकीय क्रम में सॉर्ट करें

cut -c8- कॉलम 8 से EOL तक सभी अक्षर रखें (यानी, हमारे द्वारा सम्मिलित पंक्ति संख्याओं को छोड़ दें)


5
> डेटा को सॉर्ट किए बिना केवल अनूठे परिणाम कैसे प्राप्त करें? > डेटा को
छांटे

7
'डेटा को सॉर्ट किए बिना' केवल शीर्षक में दिखाई देता है। वास्तविक आवश्यकता यह है कि: "फ़ाइल में स्टेटमेंट के मूल क्रम को बनाए रखते हुए सभी डुप्लिकेट्स (न केवल लगातार वाले) को हटाते हुए मूल फ़ाइल से सभी लाइनों को प्रदर्शित करें।"
menkus

1
@ मेनकस "फाइल में बयानों के मूल क्रम को बनाए रखते हुए" है। यह जवाब वह हासिल नहीं करता है।
एंड्रयू फेरियर

2

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

use List::MoreUtils qw(uniq)    
@output = uniq(@output);

आप यहां इस मॉड्यूल के बारे में अधिक पढ़ सकते हैं: सूची :: MoreUtils


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