중복을 제거하는 동안 두 목록을 병합


18

Busybox (OpenWRT)를 사용하는 임베디드 Linux 시스템이 있으므로 명령이 제한됩니다. 다음과 같은 두 개의 파일이 있습니다.

첫 번째 파일

aaaaaa
bbbbbb
cccccc
mmmmmm
nnnnnn

두 번째 파일

mmmmmm
nnnnnn
yyyyyy
zzzzzz

이 두 목록을 하나의 파일로 병합하고 중복을 제거해야합니다. 나는 (공간 제한) 우리는 위대한를 사용하여 얻을 수 있도록 DIFF가없는 awk, sedgrep(또는 표준 비지 박스 인스턴스에 포함 할 수있는 다른 도구). 다음과 같은 병합 파일로 이동 :

command1 > mylist.merge 
command2 mylist.merge > originallist

완전히 괜찮습니다. 한 줄 명령 일 필요는 없습니다.

현재 사용중인 Busybox 인스턴스에서 현재 정의 된 기능 (기본 OpenWRT) : [, [[, arping, ash, awk, basename, brctl, bunzip2, bzcat, cat, chgrp, chmod, chown, chroot, clear, cmp, cp, 크론, crontab, 컷, 날짜, dd, df, dirname, dmesg, du, echo, egrep, env, expr, false, fgrep, find, free, fsync, grep, gunzip, gzip, 정지, 헤드, 16 진 덤프, 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, nice, nslookup, ntpd, passwd, pgrep, pidof, ping, ping6, pivot_root, pkill, poweroff, printf, ps, pwd, reboot, reset, rm, rmdir, rmmod, route, sed, seq, sh, 수면, 정렬, 시작-중지-데몬, 문자열, switch_root, 동기화, sysctl, syslogd, 꼬리, 타르, 티, 텔넷, 텔넷, 테스트,시간, 상단, 접촉, tr, 추적 경로, 참, udhcpc, umount, uname, uniq, 가동 시간, vconfig, vi, 감시 장치, 화장실, wget, 어느, xargs, 예, zcat

답변:


28

나는 생각한다

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

당신이 원하는 것을 할 것입니다.

추가 문서 : uniq 정렬


8
busybox sort는 고유 한 플래그를 지원합니다 -u.
Thor

@Thor : oooh는 내가 익숙한 스위치가 아니라는 건배입니다.


4

다른 해결책 :

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

나는 그것이 어느 주장이 가장 먼저 다름을 알게되었다. 그렇지 않으면 훌륭한 솔루션입니다. 감사합니다.
dezza

2

일부 키 열에 따라 정렬하려면 다음을 사용하십시오.

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

여기서 첫 번째, 두 번째 및 세 번째 열을 기본 키로 고려하십시오.


1

질문의 파일이 정렬됩니다.
소스 파일이 실제로 정렬 된 경우 한 단계로 통합하여 병합 할 수 있습니다.

sort -um file1 file2 > mylist.merge

영숫자가 아닌 숫자 정렬의 경우 다음을 사용하십시오.

sort -num file1 file2 > mylist.merge

그건 못해 자리에서 수행 (하나의 소스 파일로 리디렉션).

파일이 정렬되지 않은 경우 파일을 정렬하십시오 (이 정렬은 sort 옵션을 사용하여 제자리에서 수행 할 수 있습니다 -o. 그러나 전체 파일을 메모리에로드해야합니다).

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

모든 것을 정렬하는 간단한 "하나의 명령 줄"보다 빠릅니다.

cat file1 file2 | sort -u >mylist.merge

그러나이 줄은 작은 파일에 유용 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.