Об’єднайте два списки, видаляючи дублікати


18

У мене вбудована система Linux за допомогою Busybox (OpenWRT) - тому команди обмежені. У мене є два файли:

перший файл

aaaaaa
bbbbbb
cccccc
mmmmmm
nnnnnn

другий файл

mmmmmm
nnnnnn
yyyyyy
zzzzzz

Мені потрібно об'єднати ці 2 списки в 1 файл і видалити дублікати. У мене немає відмінностей (простір обмежений) , тому ми отримуємо використовувати великий awk, sedі grep(або інші інструменти , які можуть бути включені в стандартний екземпляр Busybox). Перехід до файлу злиття на зразок:

command1 > mylist.merge 
command2 mylist.merge > originallist

абсолютно нормально. Це не повинно бути однорядковою командою.

В даний час визначені функції в екземплярі Busybox, який я використовую (за замовчуванням OpenWRT): [, [[, arping, ash, awk, basename, brctl, bunzip2, bzcat, cat, chgrp, chmod, chown, chroot, clear, cmp, cp, crond, crontab, вирізати, дата, dd, df, dirname, dmesg, du, echo, egrep, env, expr, false, fgrep, знайти, безкоштовно, fsync, grep, gunzip, gzip, halt, голова, hexdump, hostid, hwclock, id, ifconfig, init, insmod, kill, killall, klogd, менше, ln, lock, logger, logread, ls, lsmod, md5sum, mkdir, mkfifo, mknod, mktemp, mount, mv, nc, netmsg, netstat, nice, nslookup, ntpd, passwd, pgrep, pidof, ping, ping6, pivot_root, pkill, poweroff, printf, ps, pwd, перезавантажити, скинути, rm, rmdir, rmmod, маршрут, sed, seq, sh, сон, сортувати, старт-стоп-демон, рядки, switch_root, синхронізація, sysctl, syslogd, хвіст, tar, tee, telnet, telnetd, тест,час, top, touch, tr, traceroute, true, udhcpc, umount, uname, uniq, uptime, vconfig, vi, сторожовий, wc, wget, котрий, xargs, так, zcat

Відповіді:


28

Я думаю

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

зробить те, що ти хочеш.

Додаткова документація: сортування uniq


8
зайнятий сортування підтримує унікальний прапор -u.
Тор

@Thor: привіт, це не перемикач, з яким я знайомий.


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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.