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

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


8
busybox sort admite la bandera única -u.
Thor

@Thor: oooh aplausos, no es un cambio con el que estoy familiarizado.


4

Otra solución:

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

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.


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.