Führe zwei Listen zusammen, während Duplikate entfernt werden

18

Ich habe ein eingebettetes Linux-System mit Busybox (OpenWRT) - daher sind die Befehle begrenzt. Ich habe zwei Dateien, die so aussehen:

erste Datei

aaaaaa
bbbbbb
cccccc
mmmmmm
nnnnnn

zweite Datei

mmmmmm
nnnnnn
yyyyyy
zzzzzz

Ich muss diese 2 Listen in 1 Datei zusammenführen und die Duplikate entfernen. Ich habe nicht diff (Raum begrenzt ist) , so dass wir die großen erhalten zu verwenden awk, sedund grep(oder andere Tools , die in einer Standard - Busybox Instanz enthalten sein könnten). Gehen Sie zu einer Zusammenführungsdatei wie:

command1 > mylist.merge 
command2 mylist.merge > originallist

ist total ok Es muss kein einzeiliger Befehl sein.

Derzeit definierte Funktionen in der von mir verwendeten Busybox-Instanz (Standard OpenWRT): [, [[, arping, ash, awk, basename, brctl, bunzip2, bzcat, cat, chgrp, chmod, chown, chroot, clear, cmp, cp, crond, crontab, schnitt, datum, dd, df, dirname, dmesg, du, echo, egrep, env, expr, falsch, fgrep, find, free, fsync, grep, gunzip, gzip, halt, kopf, hexdump, hostid, hwclock, id, ifconfig, init, insmod, kill, killall, klogd, less, ln, sperre, 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, abschalten, printf, ps, pwd, neustarten, zurücksetzen, rm, rmdir, rmmod, route, sed, seq, sh, schlafen, sort, start-stop-daemon, strings, switch_root, sync, sysctl, syslogd, schwanz, teer, tee, telnet, telnetd, test,Zeit, oben, berühren, tr, traceroute, wahr, udhcpc, umount, uname, uniq, Betriebszeit, vconfig, vi, Wachhund, wc, wget, die, xargs, ja, zcat

learningbee
quelle

Antworten:

28

Meiner Ansicht nach

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

werde tun was du willst.

Zusätzliche Dokumentation: uniq sort

Jon
quelle
8
Die Busybox-Sortierung unterstützt das eindeutige Flag -u.
Thor
@Thor: Oh, Prost, das ist kein Schalter, den ich kenne.
10

In nur einem Befehl ohne Pipe:

sort -u FILE1 FILE2

Suche

Unterdrücke doppelte Zeilen

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

Gilles Quenot
quelle
welches ist besser für sehr große dateien? sort file1 file2 file3 file4 | uniqodersort -u file1 file2 file3 file4
0x90
4

Eine andere Lösung:

awk '!a[$0]++' file_1 file_2
nowy1
quelle
Ich sah, dass es einen Unterschied machte, welches Argument zuerst kam. Ansonsten tolle Lösung, danke.
Dezza
2

Verwenden Sie zum Sortieren nach einer Schlüsselspalte Folgendes:

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

Betrachten Sie hier die erste, zweite und dritte Spalte als Ihren Primärschlüssel.

Prem Joshi
quelle
1

Die Dateien auf Ihrer Frage sind sortiert.
Wenn die Quelldateien tatsächlich sortiert sind, können Sie sie in einem Schritt vereinheitlichen und zusammenführen:

sort -um file1 file2 > mylist.merge

Verwenden Sie für die numerische Sortierung (nicht alphanumerisch):

sort -num file1 file2 > mylist.merge

Dies konnte nicht direkt durchgeführt werden (umgeleitet zu einer Quelldatei).

Wenn die Dateien nicht sortiert sind, sortieren Sie sie (diese Sortierung kann mithilfe der Sortieroption durchgeführt werden -o. Die gesamte Datei muss jedoch in den Speicher geladen werden):

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

Das wäre schneller als die einfachere "One Command Line", um alle zu sortieren:

cat file1 file2 | sort -u >mylist.merge

Diese Zeile kann jedoch für kleine Dateien nützlich sein.

Isaac
quelle