在Linux使用中,有时候需要删除重复文件可以通过多种命令工具来实现,常用方法有sort和uniq组合、awk和sed等。具体内容如下!
如果是用sort和uniq组合命令。sort的作用是对文件进行排序,而uniq是实现过滤掉目录的重复行。组合使用就是先对文件排序再删除重复行:
sort input.txt | uniq > output.txt
其中input是输入文件名,output.txt是输出文件名。含删除重复行后的内容。
还有一种情况,是想保留文件当前的顺序,再进行删除重复文件。可以使用sort命令的-u选项(对文件进行排序删除重复行,但是不改变原始文件顺序),也可以直接用awk或者perl来实现:
awk '!seen[$0]++' input.txt > output.txt
awk是一种强大文本处理工具,华纳云之前也给大家分享过。awk用于删除重复行:
awk '!seen[$0]++' input.txt > output.txt
!seen[$0]++是一种常见的模式,用于跟踪每一行是否已经出现过。如果某行第一次出现时,seen[$0]的值0,取反后为1,所以会执行对应的操作将该行打印输出。行的seen[$0]值增加1,1以前,遇到该行的时候,!seen[$0]为0,不会因此再打印。
使用sed命令来删除重复行。sed是一种流编辑器,能处理文本流,通过结合sed和一些其他命令删除重复行:
sed '$!N; /^\(.*\)\n\1$/!P; D' input.txt > output.txt
以上命令会在sed模式空间中一次读取两行,当出现两行相同时候会删除其中一行。
使用perl命令,perl是一种强烈的脚本语言,也可支持文本处理:
perl -ne 'print unless $seen{$_}++' input.txt > output.txt
print unless $seen{$_}++会在第一次遇到该行时打印该行,将该行标记为已见过。之后再次遇到该行时,就不会打印了。如一个含重复行的input.txe文件:
apple
banana
apple
orange
banana
grape
使用以上任意方法删除重复项后,putput.txt包含:
apple
banana
orange
grape
以上使用方法都各有优势,根据实际需求来选择。常见的使用方法是sort和uniq组合,如果是要保留原始顺序,awk命令会更合适。