Hợp nhất hai danh sách trong khi loại bỏ trùng lặp


18

Tôi có một hệ thống linux được nhúng bằng Busybox (OpenWRT) - vì vậy các lệnh bị hạn chế. Tôi có hai tệp trông giống như:

tập tin đầu tiên

aaaaaa
bbbbbb
cccccc
mmmmmm
nnnnnn

tập tin thứ hai

mmmmmm
nnnnnn
yyyyyy
zzzzzz

Tôi cần hợp nhất 2 danh sách này thành 1 tệp và xóa các bản sao. Tôi không có diff (không gian được giới hạn) vì vậy chúng tôi có được sử dụng rất lớn awk, sedgrep(hoặc các công cụ khác có thể được bao gồm trong một trường hợp Busybox tiêu chuẩn). Đi đến một tệp hợp nhất như:

command1 > mylist.merge 
command2 mylist.merge > originallist

hoàn toàn ổn Nó không phải là một dòng lệnh đơn.

Các hàm được xác định hiện tại trong trường hợp Busybox mà tôi đang sử dụng (OpenWRT mặc định): [, [[, 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, m netstat, tốt đẹp, nslookup, ntpd, passwd, pgrep, pidof, ping, ping6, p Pivot_root, pkill, poweroff, printf, ps, pwd, khởi động lại, thiết lập lại, rm, rmdir, rmmod, tuyến đường sắp xếp, start-stop-daemon, chuỗi, switch_root, đồng bộ hóa, sysctl, syslogd, đuôi, tar, tee, telnet, telnetd, test,thời gian, hàng đầu, chạm, tr, traceroute, true, udhcpc, umount, uname, uniq, uptime, vconfig, vi, watchdog, wc, wget, which, xargs, yes, zcat

Câu trả lời:


28

tôi nghĩ

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

sẽ làm những gì bạn muốn.

Tài liệu bổ sung: uniq sort


8
busybox sort hỗ trợ cờ độc đáo -u.
Thor

@Thor: oooh chúc mừng đó không phải là một công tắc tôi quen thuộc.

10

Chỉ trong một lệnh mà không có bất kỳ đường ống nào:

sort -u FILE1 FILE2

Tìm kiếm

Loại bỏ các dòng trùng lặp

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


cái nào tốt hơn cho các tập tin rất lớn? sort file1 file2 file3 file4 | uniqhoặcsort -u file1 file2 file3 file4
0x90

4

Giải pháp khác:

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

Tôi thấy rằng nó đã tạo ra một sự khác biệt mà tranh luận đến trước. Nếu không thì giải pháp tuyệt vời, cảm ơn.
dezza

2

Để sắp xếp theo một số cột chính sử dụng như sau:

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

ở đây coi cột thứ nhất, thứ hai và thứ ba là khóa chính của bạn.


1

Các tập tin về câu hỏi của bạn được sắp xếp.
Nếu các tệp nguồn thực sự được sắp xếp, bạn có thể uniq và hợp nhất trong một bước:

sort -um file1 file2 > mylist.merge

Đối với sắp xếp số (không phải chữ và số), sử dụng:

sort -num file1 file2 > mylist.merge

Điều đó không thể được thực hiện tại chỗ (chuyển hướng đến một tệp nguồn).

Nếu các tệp không được sắp xếp, hãy sắp xếp chúng (loại này có thể được thực hiện tại chỗ, sử dụng tùy chọn sắp xếp -o. Tuy nhiên, toàn bộ tệp cần được tải vào bộ nhớ):

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

Điều đó sẽ nhanh hơn "một dòng lệnh" đơn giản hơn để sắp xếp tất cả:

cat file1 file2 | sort -u >mylist.merge

Tuy nhiên, dòng này có thể hữu ích cho các tệp nhỏ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.