Mesclar duas listas ao remover duplicatas

15

Eu tenho um sistema Linux embutido usando o Busybox (OpenWRT) - então os comandos são limitados. Eu tenho dois arquivos semelhantes:

primeiro arquivo

aaaaaa
bbbbbb
cccccc
mmmmmm
nnnnnn

segundo arquivo

mmmmmm
nnnnnn
yyyyyy
zzzzzz

Eu preciso mesclar essas duas listas em um arquivo e remover as duplicatas. Eu não tenho diff (o espaço é limitado), então usamos o ótimo awk , sed e grep (ou outras ferramentas que podem ser incluídas em uma instância padrão do Busybox). 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 (padrão OpenWRT):         [ [[arping, ash, awk, nome base, brctl, bunzip2, bzcat, gato, chgrp, chmod, chown, chroot, claro, cmp,         cp, crond, crontab, corte, data, dd, df, dirname, dmesg, du, eco, egrep, env, expr, falso, fgrep, achado,         livre, fsync, grep, gunzip, gzip, parada, cabeça, hexdump, hostid, hwclock, id, ifconfig, init, insmod, matar,         killall, klogd, less, ln, bloqueio, logger, logread, lsmod, md5sum, mkdir, mkfifo, mknod, mktemp, montagem,         mv, nc, netmsg, netstat, agradável, nslookup, ntpd, passwd, pgrep, pidof, ping, ping6, pivot_root, pkill,         poweroff, printf, ps, pwd, reiniciar, redefinir, rm, rmdir, rmmod, rota, sed, seq, sh, sono, tipo,         start-stop-daemon, strings, switch_root, sincronização, sysctl, syslogd, final, tar, tee, telnet, telnetd, teste,         tempo, superior, toque, tr, traceroute, verdadeiro, udhcpc, umount, uname, uniq, tempo de atividade, vconfig, vi, watchdog, wc,         wget, que, xargs, sim, zcat

    
por learningbee 02.10.2012 / 20:42

5 respostas

24

Eu acho que

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

fará o que você quiser.

Documentação Adicional: uniq ordenar

    
por 02.10.2012 / 20:46
8

Em apenas um comando sem nenhum canal:

sort -u FILE1 FILE2

pesquisa

Suppress duplicate lines

- > link

    
por 06.10.2012 / 18:52
3

Outra solução:

awk '!a[$0]++' file_1 file_2
    
por 06.10.2012 / 21:08
1

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

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

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

    
por 17.02.2017 / 05:26
1

Os arquivos da sua pergunta são classificados.
Se os arquivos de origem forem realmente classificados, você poderá uniq e mesclar em uma única etapa:

sort -um file1 file2 > mylist.merge

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

sort -num file1 file2 > mylist.merge

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

Se os arquivos não estiverem classificados, classifique-os (esse tipo pode ser feito no lugar, 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 simples "linha de comando" para classificar todos:

cat file1 file2 | sort -u >mylist.merge

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

    
por 07.05.2018 / 01:47