Unisci due elenchi rimuovendo i duplicati


18

Ho un sistema Linux incorporato usando Busybox (OpenWRT) - quindi i comandi sono limitati. Ho due file che sembrano:

primo file

aaaaaa
bbbbbb
cccccc
mmmmmm
nnnnnn

secondo file

mmmmmm
nnnnnn
yyyyyy
zzzzzz

Devo unire questi 2 elenchi in 1 file e rimuovere i duplicati. Non ho diff (lo spazio è limitato) e quindi si arriva a usare la grande awk, sede grep(o altri strumenti che potrebbero essere inclusi in un'istanza di serie Busybox). Passare a un file di unione come:

command1 > mylist.merge 
command2 mylist.merge > originallist

è totalmente ok. Non deve essere un comando a riga singola.

Funzioni attualmente definite nell'istanza di Busybox che sto utilizzando (OpenWRT predefinito): [, [[, 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, ordina, da-start-stop-demone, stringhe, switch_root, sync, sysctl, syslogd, tail, tar, tee, telnet, telnetd, test,tempo, top, touch, tr, traceroute, true, udhcpc, umount, uname, uniq, uptime, vconfig, vi, watchdog, wc, wget, che, xargs, yes, zcat

Risposte:


28

penso

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

farà quello che vuoi.

Documentazione aggiuntiva: uniq sort


8
busybox sort supporta il flag univoco -u.
Thor,

@Thor: oooh evviva che non è un interruttore con cui ho familiarità.


4

Un'altra soluzione:

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

Ho visto che ha fatto la differenza quale argomento è venuto per primo. Altrimenti ottima soluzione, grazie.
dezza,

2

Per ordinare in base ad alcune colonne chiave, utilizzare quanto segue:

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

qui considera la prima, seconda e terza colonna come chiave primaria.


1

I file sulla tua domanda sono ordinati.
Se i file di origine sono effettivamente ordinati, è possibile unire e unire in un solo passaggio:

sort -um file1 file2 > mylist.merge

Per l'ordinamento numerico (non alfanumerico), utilizzare:

sort -num file1 file2 > mylist.merge

Quello potrebbe stato possibile farlo sul posto (reindirizzato a un file di origine).

Se i file non vengono ordinati, ordinarli (questo ordinamento potrebbe essere eseguito in posizione, utilizzando l'opzione di ordinamento -o . Tuttavia, l'intero file deve essere caricato in memoria):

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

Sarebbe più veloce della semplice "riga di comando" per ordinare tutto:

cat file1 file2 | sort -u >mylist.merge

Tuttavia, questa riga potrebbe essere utile per file di piccole dimensioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.