डुप्लिकेट को हटाते समय दो सूचियों को मर्ज करें


18

मेरे पास बिजीबॉक्स (OpenWRT) का उपयोग करके एक एम्बेडेड लिनक्स सिस्टम है - इसलिए कमांड सीमित हैं। मेरे पास दो फाइलें हैं जो इस तरह दिखती हैं:

पहली फ़ाइल

aaaaaa
bbbbbb
cccccc
mmmmmm
nnnnnn

दूसरी फ़ाइल

mmmmmm
nnnnnn
yyyyyy
zzzzzz

मुझे इन 2 सूचियों को 1 फ़ाइल में मर्ज करने और डुप्लिकेट को निकालने की आवश्यकता है। मैं diff की जरूरत नहीं है (अंतरिक्ष सीमित है) तो हम महान उपयोग करने के लिए मिलता है awk, sedऔर grep(या अन्य उपकरण है कि एक मानक बिजीबॉक्स उदाहरण में शामिल किया जा सकता है)। मर्ज फ़ाइल में जाना जैसे:

command1 > mylist.merge 
command2 mylist.merge > originallist

पूरी तरह से ठीक है। इसमें सिंगल-लाइन कमांड होना जरूरी नहीं है।

वर्तमान में व्यस्त फ़ंक्शंस में परिभाषित फ़ंक्शंस, जो मैं उपयोग कर रहा हूँ (डिफ़ॉल्ट OpenWRT): [, [, [, अर्पिंग, ऐश, एसेक, बेसेंम, ब्रेटल, बंजिप 2, बज़कट, कैट, चगर्प, चामोड, चाउर, चेरोट, क्लियर, सीएमपी,। cp, crond, crontab, cut, date, dd, df, dirname, dmesg, du, echo, egrep, env, expr, false, fgrep, find, free, freync, grep, gunzip, gzip, halt, head, hexdump, hostid, hwlock, id, ifconfig, init, insmod, Kill, Killall, klogd, less, ln, lock, logger, logread, ls, lsmod, md5sum, mkdir, mkfifo, mknod, mktemp, Mount, mv, nc, netms netstat, Nice, nslookup, ntpd, passwd, pgrep, pidof, पिंग, ping6, pivot_root, pkill, poweroff, printf, ps, pwd, रिबूट, रीसेट, rm, rmdir, rmmod, मार्ग, sed, seq, sh। सॉर्ट, स्टार्ट-स्टॉप-डेमॉन, स्ट्रिंग्स, switch_root, सिंक, sysctl, syslogd, टेल, टार, टी, टेलनेट, टेलनेट, टेस्ट,समय, शीर्ष, स्पर्श, tr, अनुरेखक, सत्य, udhcpc, umount, uname, uniq, uptime, vconfig, vi, watchdog, wc, wget, जो, xargs, yes, zcat

जवाबों:


28

मुझे लगता है

sort file1 file2 | uniq
aaaaaa
bbbbbb
cccccc
mmmmmm
nnnnnn
yyyyyy
zzzzzz

जो चाहोगे, करोगे।

अतिरिक्त प्रलेखन: uniq तरह


8
बिजीबॉक्स सॉर्ट अद्वितीय ध्वज का समर्थन करता है -u
थोर

@ थोर: ऊह चीयर्स जो एक स्विच नहीं है जिससे मैं परिचित हूं।


4

एक और समाधान:

awk '!a[$0]++' file_1 file_2

मैंने देखा कि इससे फर्क पड़ा कि कौन सा तर्क पहले आया। अन्यथा महान समाधान, धन्यवाद।
dezza

2

निम्नलिखित कुछ प्रमुख स्तंभ उपयोग के अनुसार क्रमबद्ध करने के लिए:

awk '!duplicate[$1,$2,$3]++' file_1 file_2

यहां पहले, दूसरे और तीसरे कॉलम को अपनी प्राथमिक कुंजी मानें।


1

आपके प्रश्न की फाइलें क्रमबद्ध हैं।
यदि स्रोत फ़ाइलें वास्तव में सॉर्ट की जाती हैं, तो आप एक चरण में यूनीक और मर्ज कर सकते हैं:

sort -um file1 file2 > mylist.merge

संख्यात्मक प्रकार (अल्फ़ान्यूमेरिक नहीं) के लिए, उपयोग करें:

sort -num file1 file2 > mylist.merge

वह इन-प्लेस (एक स्रोत फ़ाइल पर पुनर्निर्देशित) नहीं किया जा सका ।

यदि फ़ाइलों को सॉर्ट नहीं किया जाता है, तो उन्हें सॉर्ट करें (यह सॉर्ट सॉर्ट विकल्प का उपयोग करके जगह में किया जा सकता है -o । हालाँकि, पूरी फ़ाइल को मेमोरी में लोड करने की आवश्यकता है):

sort -uo file1 file1
sort -uo file2 file2
sort -um file1 file2 > mylist.merge
mv mylist.merge originallist

यह सभी को हल करने के लिए सरल "एक कमांड लाइन" से तेज होगा:

cat file1 file2 | sort -u >mylist.merge

हालाँकि, यह लाइन छोटी फ़ाइलों के लिए उपयोगी हो सकती है।

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