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




4 Answers

यूनिक्स बैश स्क्रिप्टिंग ब्लॉग suggests :

awk '!x[$0]++'

यह आदेश प्रिंट करने के लिए कौन सी लाइनों को बता रहा है। परिवर्तनीय $0 में एक पंक्ति की पूरी सामग्री होती है और स्क्वायर ब्रैकेट सरणी पहुंच होती है। इसलिए, फ़ाइल की प्रत्येक पंक्ति के लिए, सरणी x का नोड बढ़ाया गया है और उस नोड की सामग्री पहले सेट नहीं होने पर लाइन मुद्रित की गई थी।

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

#!/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) एक साधारण यूनिक्स उपयोगिता के रूप में उपलब्ध होना चाहिए, है ना? शायद एक पाइप में फिल्टर का संयोजन?

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




ऊपर माइकल हॉफमैन का समाधान छोटा और प्यारा है। बड़ी फ़ाइलों के लिए, एक श्वार्टज़ियन परिवर्तन दृष्टिकोण जिसमें एक इंडेक्स फ़ील्ड को जोड़ने के अलावा अजीब का उपयोग करके क्रमशः कई राउंड और यूनिक में कम मेमोरी ओवरहेड शामिल है। निम्नलिखित स्निपेट बाश में काम करता है

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



2 फाइलों से डुप्लिकेट हटाने के लिए:

awk '!a[$0]++' file1.csv file2.csv






Related