Kopyaları kaldırırken iki listeyi birleştir


18

Busybox (OpenWRT) kullanarak gömülü bir linux sistemim var - bu yüzden komutlar sınırlı. Şöyle iki dosya var:

ilk dosya

aaaaaa
bbbbbb
cccccc
mmmmmm
nnnnnn

ikinci dosya

mmmmmm
nnnnnn
yyyyyy
zzzzzz

Bu 2 liste 1 dosyada birleştirmek ve yinelenenleri kaldırmak gerekir. Ben fark var (boşluk sınırlıdır) biz büyük kullanım için olsun böylece yok awk, sedvegrep (veya standart Busybox örneği dahil edilebilecek diğer araçları). Aşağıdaki gibi bir birleştirme dosyasına gidiyor:

command1 > mylist.merge 
command2 mylist.merge > originallist

Tamam. Tek satırlık bir komut olması gerekmez.

Şu anda kullandığım Busybox örneğinde tanımlanan işlevler (varsayılan OpenWRT): [, [[, arping, ash, awk, basename, brctl, bunzip2, bzcat, kedi, chgrp, chmod, chown, chroot, clear, cmp, cp, crond, crontab, kes, tarih, dd, df, dirname, dmesg, du, yankı, egrep, env, ifade, yanlış, fgrep, bul, ücretsiz, fsync, grep, gunzip, gzip, dur, kafa, hexdump, hostid, hwclock, id, ifconfig, init, insmod, öldürmek, killall, klogd, daha az, ln, kilitlemek, logger, logread, ls, lsmod, md5sum, mkdir, mkfifo, mknod, mktemp, mount, mv, nc, netmsg, netstat, güzel, nslookup, ntpd, passwd, pgrep, pidof, ping, ping6, pivot_root, pkill, poweroff, printf, ps, pwd, yeniden başlatma, sıfırlama, rm, rmdir, rmmod, rota, sed, seq, sh, uyku, sıralama, start-stop-daemon, dizeleri, switch_root, eşitleme, sysctl, syslogd, kuyruk, katran, tee, telnet, telnetd, test,zaman, üst, dokunma, tr, traceroute, gerçek, udhcpc, umount, uname, uniq, çalışma zamanı, vconfig, vi, bekçi köpeği, wc, wget, hangi, xargs, evet, zcat

Yanıtlar:


28

bence

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

ne istersen yapacak.

Ek Belgeler: uniq sort


8
busybox sort benzersiz bayrağı destekler -u.
Thor

@Thor: oooh şerefe bu tanıdığım bir anahtar değil.


4

Başka bir çözüm:

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

İlk önce hangi argümanın geldiğini fark ettim. Aksi takdirde harika bir çözüm, teşekkürler.
dezza

2

Bazı anahtar sütunlarına göre sıralamak için aşağıdakileri kullanın:

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

burada birinci, ikinci ve üçüncü sütunu birincil anahtarınız olarak düşünün.


1

Sorunuzdaki dosyalar sıralanır.
Kaynak dosyalar gerçekten sıralandıysa, tek adımda uniq ve birleştirebilirsiniz:

sort -um file1 file2 > mylist.merge

Sayısal sıralama için (alfasayısal değil) şunu kullanın:

sort -num file1 file2 > mylist.merge

Yani olabilir değil yerinde yapılması (bir kaynak dosyası yönlendirilmiş).

Dosyalar sıralanmamışsa, bunları sıralayın (sıralama seçeneği kullanılarak bu sıralama yerinde yapılabilir -o. Ancak, tüm dosyanın belleğe yüklenmesi gerekir):

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

Hepsini sıralamak için daha basit "tek bir komut satırından" daha hızlı olurdu:

cat file1 file2 | sort -u >mylist.merge

Ancak, bu satır küçük dosyalar için yararlı olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.