Gabungkan dua daftar sambil menghapus duplikat

18

Saya memiliki sistem linux tertanam menggunakan Busybox (OpenWRT) - jadi perintah terbatas. Saya memiliki dua file yang terlihat seperti:

file pertama

aaaaaa
bbbbbb
cccccc
mmmmmm
nnnnnn

file kedua

mmmmmm
nnnnnn
yyyyyy
zzzzzz

Saya perlu menggabungkan 2 daftar ini menjadi 1 file, dan menghapus duplikatnya. Saya tidak memiliki diff (ruang terbatas) sehingga kami bisa menggunakan besar awk, seddan grep(atau alat-alat lain yang mungkin termasuk dalam contoh Busybox standar). Pergi ke file gabungan seperti:

command1 > mylist.merge 
command2 mylist.merge > originallist

benar-benar baik-baik saja. Itu tidak harus menjadi perintah baris tunggal.

Fungsi yang saat ini didefinisikan dalam instance Busybox yang saya gunakan (default OpenWRT): [, [[, arping, ash, awk, nama kecil, brctl, bunzip2, bzcat, cat, chgrp, chmod, chown, chroot, clear, cmp, cp, crond, crontab, potong, tanggal, dd, df, dirname, dmesg, du, gema, egrep, env, expr, false, fgrep, cari, gratis, fsync, grep, gunzip, gzip, berhenti, kepala, 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, bagus, nslookup, ntpd, passwd, pgrep, pidof, ping, ping6, pivot_root, pkill, poweroff, printf, ps, pwd, reboot, reset, rm, rmdir, rmmod, rute, sed, seq, sh, sleep, sortir, start-stop-daemon, string, switch_root, sinkronisasi, sysctl, syslogd, tail, tar, tee, telnet, telnetd, tes,waktu, atas, sentuh, tr, traceroute, true, udhcpc, umount, uname, uniq, uptime, vconfig, vi, pengawas, wc, wget, yang, xargs, ya, zcat

learningbee
sumber

Jawaban:

28

kupikir

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

akan melakukan apa yang Anda inginkan.

Dokumentasi Tambahan: jenis uniq

Jon
sumber
8
Jenis busybox mendukung flag yang unik -u.
Thor
@Thor: oooh sorakan itu bukan saklar yang saya kenal.
10

Hanya dalam satu perintah tanpa pipa:

sort -u FILE1 FILE2

Cari

Menekan garis rangkap

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

Gilles Quenot
sumber
mana yang lebih baik untuk file yang sangat besar? sort file1 file2 file3 file4 | uniqatausort -u file1 file2 file3 file4
0x90
4

Solusi lain:

awk '!a[$0]++' file_1 file_2
sekarang1
sumber
Saya melihat bahwa itu membuat perbedaan argumen mana yang lebih dulu. Kalau tidak solusi yang bagus, terima kasih.
dezza
2

Untuk mengurutkan berdasarkan beberapa kolom utama gunakan berikut ini:

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

di sini pertimbangkan kolom pertama, kedua dan ketiga sebagai kunci utama Anda.

Prem Joshi
sumber
1

File pada pertanyaan Anda diurutkan.
Jika file sumber benar-benar diurutkan, Anda dapat menyatukan dan menggabungkan dalam satu langkah:

sort -um file1 file2 > mylist.merge

Untuk pengurutan angka (bukan alfanumerik), gunakan:

sort -num file1 file2 > mylist.merge

Itu tidak dapat dilakukan di tempat (dialihkan ke satu file sumber).

Jika file tidak diurutkan, sortirlah (sortir ini dapat dilakukan di tempat, menggunakan opsi sortir -o. Namun, keseluruhan file perlu dimuat ke dalam memori):

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

Itu akan lebih cepat daripada "satu baris perintah" yang lebih sederhana untuk mengurutkan semua:

cat file1 file2 | sort -u >mylist.merge

Namun, baris ini bisa berguna untuk file kecil.

Ishak
sumber