Объединить два списка при удалении дубликатов

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, cut, date, dd, df, dirname, dmesg, du, echo, egrep, env, expr, false, fgrep, find, free, fsync, grep, gunzip, gzip, остановка, голова, hexdump, hostid, hwclock, id, ifconfig, init, insmod, kill, killall, klogd, меньше, ln, блокировка, 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, route, sed, seq, sh, sleep, sort, start-stop-daemon, строки, switch_root, синхронизация, sysctl, syslogd, tail, tar, tee, telnet, telnetd, test,время, top, touch, tr, traceroute, true, udhcpc, umount, uname, uniq, uptime, vconfig, vi, watchdog, wc, wget, который, xargs, да, zcat

learningbee
источник

Ответы:

28

я думаю

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

будет делать то, что вы хотите.

Дополнительная документация: uniq sort

Джон
источник
8
Занятая сортировка поддерживает уникальный флаг -u.
Тор
@Thor: ооо, ура, это не переключатель, с которым я знаком.
10

Всего за одну команду без какой-либо трубы:

sort -u FILE1 FILE2

поиск

Подавить дубликаты строк

-> http://www.busybox.net/downloads/BusyBox.html

Жиль Квено
источник
какой из них лучше для очень больших файлов? sort file1 file2 file3 file4 | uniqилиsort -u file1 file2 file3 file4
0x90
4

Другое решение:

awk '!a[$0]++' file_1 file_2
nowy1
источник
Я видел, что это имело значение, какой аргумент пришел первым. В противном случае отличное решение, спасибо.
Dezza
2

Для сортировки по некоторому ключевому столбцу используйте следующее:

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

здесь рассмотрим первый, второй и третий столбцы в качестве первичного ключа.

Прем Джоши
источник
1

Файлы по вашему вопросу отсортированы.
Если исходные файлы действительно отсортированы, вы можете uniq и объединить за один шаг:

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

Однако эта строка может быть полезна для небольших файлов.

Исаак
источник