[shell] यूनिक्स: सॉर्ट किए बिना डुप्लिकेट लाइनों को हटा रहा है


Answers

देर से जवाब - मैं बस इस के एक डुप्लिकेट में भाग गया - लेकिन शायद जोड़ने लायक ...

लाइन नंबर जोड़ने के लिए अजीब के बजाय cat -n का उपयोग करके, @ 1_CR के उत्तर के पीछे सिद्धांत अधिक संक्षेप में लिखा जा सकता है:

cat -n file_name | sort -uk2 | sort -nk1 | cut -f2-
  • पंक्ति संख्या cat -n करने के लिए cat -n का उपयोग करें
  • sort -u डुप्लिकेट डेटा को हटाएं
  • प्रीपेड नंबर द्वारा सॉर्ट करने के लिए sort -n का उपयोग करें
  • लाइन नंबरिंग को हटाने के लिए cut का उपयोग करें
Question

मेरे पास पाइथन में एक उपयोगिता स्क्रिप्ट है:

#!/usr/bin/env python
import sys
unique_lines = []
duplicate_lines = []
for line in sys.stdin:
  if line in unique_lines:
    duplicate_lines.append(line)
  else:
    unique_lines.append(line)
    sys.stdout.write(line)
# optionally do something with duplicate_lines

यह सरल कार्यक्षमता (पहले, स्थिर क्रमबद्ध करने की आवश्यकता के बिना uniq) एक साधारण यूनिक्स उपयोगिता के रूप में उपलब्ध होना चाहिए, है ना? शायद एक पाइप में फिल्टर का संयोजन?

पूछने का कारण: इस कार्यक्षमता को उस सिस्टम पर जरूरी है जिस पर मैं कहीं से भी पाइथन निष्पादित नहीं कर सकता




धन्यवाद 1_CR! मुझे यूनिक के बजाय "uniq -u" (पूरी तरह डुप्लिकेट हटाएं) की आवश्यकता है (डुप्लिकेट की 1 प्रति छोड़ दें)। अजीब और perl समाधान वास्तव में ऐसा करने के लिए संशोधित नहीं किया जा सकता है, आप कर सकते हैं! मुझे कम स्मृति उपयोग की भी आवश्यकता हो सकती है क्योंकि मैं 100,000,000 लाइनों की तरह unqqing होगा 8-)। अगर किसी और को इसकी ज़रूरत है, तो बस मैंने आदेश के यूनिक हिस्से में "-u" डाला है:

awk '{print(NR"\t"$0)}' file_name | sort -t$'\t' -k2,2 | uniq -u --skip-fields 1 | sort -k1,1 -t$'\t' | cut -f2 -d$'\t'



अब आप जंग में लिखे इस छोटे उपकरण को देख सकते हैं: uq

यह पहले इनपुट को सॉर्ट किए बिना विशिष्टता फ़िल्टरिंग करता है, इसलिए निरंतर स्ट्रीम पर लागू हो सकता है।




मैं बस फाइलों में हर जगह नहीं, निम्नलिखित लाइनों पर सभी डुप्लीकेट को हटाना चाहता था। तो मैंने इस्तेमाल किया:

awk '{
  if ($0 != PREVLINE) print $0;
  PREVLINE=$0;
}'



Related