合并两个列表,同时删除重复项


18

我有一个使用Busybox(OpenWRT)的嵌入式Linux系统-因此命令受到限制。我有两个看起来像的文件:

第一个档案

aaaaaa
bbbbbb
cccccc
mmmmmm
nnnnnn

第二档

mmmmmm
nnnnnn
yyyyyy
zzzzzz

我需要将这2个列表合并为1个文件,并删除重复项。 我没有差异(空间有限),所以我们得到使用的伟大awksedgrep(或可能被包含在一个标准的Busybox的实例其他工具)。转到合并文件,如:

command1 > mylist.merge 
command2 mylist.merge > originallist

完全可以。它不必是单行命令。

我正在使用的Busybox实例中当前定义的函数(默认为OpenWRT):[,[[,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,更少,ln,锁,记录器,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,重新启动,重置,rm,rmdir,rmmod,route,sed,seq,sh,sleep,排序,启动停止守护程序,字符串,switch_root,sync,sysctl,syslogd,tail,tar,Tee,telnet,telnetd,test,时间,顶部,触摸,tr,traceroute,true,udhcpc,umount,uname,uniq,正常运行时间,vconfig,vi,看门狗,wc,wget,其中,xargs,是,zcat

Answers:


28

我认为

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

会做你想要的。

附加文档:uniq 排序


8
busybox排序支持唯一标志-u
2012年

@Thor:噢,我不熟悉的欢呼声没有改变。


4

另一个解决方案:

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

我看到哪个论据首先产生了影响。否则,很好的解决方案,谢谢。
dezza

2

要根据一些关键列进行排序,请使用以下命令:

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

这里以第一,第二和第三列为主键。


1

您问题上的文件已排序。
如果确实对源文件进行了排序,则可以一步进行uniq和合并:

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

但是,此行对于小文件可能很有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.