在处理文本文件时,我们经常会遇到需要合并多个文件并去除重复行的情况。在 Linux 环境中,awk 命令提供了一种高效的方式来实现这一需求,同时保留了数据的原始顺序。下面,我们将详细介绍如何使用 awk 命令合并文件,并对比另一种可能改变原始顺序的去重方法。
不改变顺序去重
使用awk
命令去重并保留顺序
awk 是一个功能强大的文本处理工具,它可以执行复杂的数据提取和报告。以下是一个使用 awk 命令合并文件并去重的示例,同时保留了数据的原始顺序:
awk '!seen[$0]++' file1 file2 > combined_file
这条命令的组成部分解释如下:
file1 file2
:指定要合并的文件。awk
:调用awk
程序。'!seen[$0]++'
:awk
的表达式,会创建一个 map 叫seen
,然后用当前行的全文$0
作为 map 的 key,用于跟踪每一行是否已经被处理。如果某行是首次出现,则seen[$0]
的值为 0,!seen[$0]
为真,该行会被打印出来。随后,seen[$0]
的值递增,相同的行再次出现时不会被打印。>
:将输出重定向到新文件。combined_file
:输出文件的名称,包含合并后的内容,不包含重复行。
这个命令会保持file1
和file2
中行的原始顺序,只保留首次出现的行。
示例
假设我们有两个文件file1
和file2
,内容如下:
file1:
333
222
111
file2:
222
333
444
555
执行上述awk
命令后,合并的结果将是:
333
222
111
444
555
排序去重
使用 sort | uniq
一种常见的去重方法是使用 sort 和 uniq 命令组合。这种方法会对数据进行排序,因此可能会改变原始数据的顺序。
sort file1 file2 | uniq > combined_file
使用comm
命令
comm
命令用于比较两个已排序的文件,并可以输出三列:只在文件 1 中的行、只在文件 2 中的行和两个文件共有的行。要使用comm
去重,需要先对文件进行排序。
sort file1 > file1_sorted
sort file2 > file2_sorted
comm -12 file1_sorted file2_sorted > combined_file