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

Jawaban:


28

kupikir

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

akan melakukan apa yang Anda inginkan.

Dokumentasi Tambahan: jenis uniq


8
Jenis busybox mendukung flag yang unik -u.
Thor

@Thor: oooh sorakan itu bukan saklar yang saya kenal.


4

Solusi lain:

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

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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.