Mesclar duas listas enquanto remove duplicatas


18

Eu tenho um sistema Linux embutido usando o Busybox (OpenWRT) - portanto, os comandos são limitados. Eu tenho dois arquivos que se parecem com:

primeiro arquivo

aaaaaa
bbbbbb
cccccc
mmmmmm
nnnnnn

segundo arquivo

mmmmmm
nnnnnn
yyyyyy
zzzzzz

Preciso mesclar essas 2 listas em 1 arquivo e remover as duplicatas. Eu não tenho diff (o espaço é limitado) então temos de usar o grande awk, sede grep(ou outras ferramentas que podem ser incluídos em uma instância Busybox standard). Indo para um arquivo de mesclagem como:

command1 > mylist.merge 
command2 mylist.merge > originallist

está totalmente ok. Não precisa ser um comando de linha única.

Funções atualmente definidas na instância do Busybox que estou usando (OpenWRT padrão): [, [[, arping, ash, awk, basename, brctl, bunzip2, bzcat, cat, chgrp, chmod, chown, chroot, clear, cmp, cp, crond, crontab, cut, date, dd, df, dirname, dmesg, du, eco, egrep, env, expr, false, fgrep, encontre, free, fsync, grep, gunzip, gzip, halt, head, hexdump, hostid, hwclock, id, ifconfig, init, insmod, kill, killall, klogd, less, ln, lock, logger, logread, ls, lsmod, md5sum, mkdir, mkfifo, mknod, mktemp, montagem, mv, nc, netmsg, netstat, nice, nslookup, ntpd, passwd, pgrep, pidof, ping, ping6, pivot_root, pkill, poweroff, printf, ps, pwd, reboot, reset, rm, rmdir, rmmod, rota, sed, seq, sh, sleep, sort, start-stop-daemon, strings, switch_root, sync, sysctl, syslogd, tail, tar, tee, telnet, telnetd, teste,tempo, topo, toque, tr, traceroute, true, udhcpc, umount, uname, uniq, tempo de atividade, vconfig, vi, watchdog, wc, wget, what, xargs, yes, zcat

Respostas:


28

eu acho que

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

fará o que você quiser.

Documentação adicional: uniq sort


8
A classificação busybox suporta o sinalizador exclusivo -u.
Thor

@ Thor: oooh aplausos que não é um interruptor que eu estou familiarizado.


4

Outra solução:

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

Vi que fazia diferença qual argumento vinha primeiro. Caso contrário, ótima solução, obrigado.
Dezza

2

Para classificar de acordo com alguma coluna-chave, use o seguinte:

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

aqui considere a primeira, a segunda e a terceira coluna como sua chave primária.


1

Os arquivos da sua pergunta estão classificados.
Se os arquivos de origem forem realmente classificados, é possível uniq e mesclar em uma etapa:

sort -um file1 file2 > mylist.merge

Para classificação numérica (não alfanumérica), use:

sort -num file1 file2 > mylist.merge

Isso não pôde ser feito no local (redirecionado para um arquivo de origem).

Se os arquivos não forem classificados, classifique-os (essa classificação pode ser feita no local, usando a opção de classificação -o. No entanto, o arquivo inteiro precisa ser carregado na memória):

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

Isso seria mais rápido do que a "linha de comando" mais simples para classificar tudo:

cat file1 file2 | sort -u >mylist.merge

No entanto, essa linha pode ser útil para arquivos pequenos.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.