从文本文件中删除重复行是Bash脚本中的一项常见任务。本文探讨了两种高效的方法:使用sort
和uniq
,以及利用awk
的强大功能。
目录
使用sort
和uniq
这种方法结合了两个基本的Unix实用程序,提供了一个直接的解决方案。sort
按字母顺序排列行,这是uniq
的先决条件,uniq
随后消除连续的重复项。每行的*第一次*出现顺序将被保留。
以下是命令:
sort file.txt | uniq > file_unique.txt
这将file.txt
排序后的输出通过管道传递给uniq
,并将唯一行保存到file_unique.txt
中。原始文件保持不变。
示例:
如果file.txt
包含:
apple
banana
apple
orange
banana
grape
file_unique.txt
将包含:
apple
banana
grape
orange
使用awk
命令
awk
提供了一种更灵活、更强大的解决方案,尤其是在保留行的原始顺序至关重要时。它使用关联数组来跟踪遇到的行。
该命令非常简洁:
awk '!seen[$0]++' file.txt > file_unique.txt
让我们分解一下:
$0
表示当前整行。seen[$0]
访问seen
数组中的一个元素,使用该行作为键。++
后增量值(最初为0)。!
否定结果;只有在第一次遇到该行时(当seen[$0]
为0时),才会打印该行。
此方法保持行的原始顺序。
示例:
使用相同的file.txt
,file_unique.txt
中的输出将为:
apple
banana
orange
grape
结论:
这两种方法都能有效地删除重复行。对于基本场景,sort | uniq
更简单;而awk
则提供更好的灵活性和控制,尤其是在保留原始顺序或处理更复杂的重复删除需求时。