Combina dos listas mientras eliminas duplicados

18

Tengo un sistema Linux integrado que usa Busybox (OpenWRT), por lo que los comandos son limitados. Tengo dos archivos que se parecen a:

primer archivo

aaaaaa
bbbbbb
cccccc
mmmmmm
nnnnnn

segundo archivo

mmmmmm
nnnnnn
yyyyyy
zzzzzz

Necesito fusionar estas 2 listas en 1 archivo y eliminar los duplicados. No tengo diff (el espacio es limitado) por lo que tenemos que utilizar el gran awk, sedy grep(u otras herramientas que podrían incluirse en un caso estándar Busybox). Ir a un archivo de fusión como:

command1 > mylist.merge 
command2 mylist.merge > originallist

está totalmente bien No tiene que ser un comando de una sola línea.

Funciones definidas actualmente en la instancia de Busybox que estoy usando (OpenWRT predeterminado): [, [[, 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, halt, head, hexdump, hostid, hwclock, id, ifconfig, init, insmod, kill, killall, klogd, less, 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, reboot, reset, rm, rmdir, rmmod, route, sed, seq, sh, sleep, sort, start-stop-daemon, strings, switch_root, sync, sysctl, syslogd, tail, tar, tee, telnet, telnetd, test,tiempo, superior, táctil, tr, traceroute, verdadero, udhcpc, umount, uname, uniq, uptime, vconfig, vi, watchdog, wc, wget, cual, xargs, sí, zcat

aprendizaje
fuente

Respuestas:

28

Yo creo que

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

Hará lo que quieras.

Documentación adicional: uniq sort

Jon
fuente
8
busybox sort admite la bandera única -u.
Thor
@Thor: oooh aplausos, no es un cambio con el que estoy familiarizado.
10

En un solo comando sin ninguna tubería:

sort -u FILE1 FILE2

buscar

Suprimir líneas duplicadas

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

Gilles Quenot
fuente
¿Cuál es mejor para archivos muy grandes? sort file1 file2 file3 file4 | uniqosort -u file1 file2 file3 file4
0x90
4

Otra solución:

awk '!a[$0]++' file_1 file_2
nowy1
fuente
Vi que marcó la diferencia qué argumento vino primero. De lo contrario, gran solución, gracias.
dezza
2

Para ordenar de acuerdo con alguna columna clave, use lo siguiente:

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

aquí considere la primera, segunda y tercera columna como su clave principal.

Prem Joshi
fuente
1

Los archivos de su pregunta están ordenados.
Si los archivos de origen están ordenados, puede unificar y fusionar en un solo paso:

sort -um file1 file2 > mylist.merge

Para la ordenación numérica (no alfanumérica), use:

sort -num file1 file2 > mylist.merge

Eso no se pudo hacer en el lugar (redirigido a un archivo fuente).

Si los archivos no están ordenados, ordénelos (este orden podría hacerse en su lugar, utilizando la opción de ordenar -o. Sin embargo, todo el archivo debe cargarse en la memoria):

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

Eso sería más rápido que la simple "línea de comando" para ordenar todo:

cat file1 file2 | sort -u >mylist.merge

Sin embargo, esta línea podría ser útil para archivos pequeños.

Isaac
fuente