Linux 去除重复行而不改变顺序

文章目录

在处理文本文件时,我们经常会遇到需要合并多个文件并去除重复行的情况。在 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:输出文件的名称,包含合并后的内容,不包含重复行。

这个命令会保持file1file2中行的原始顺序,只保留首次出现的行。

示例

假设我们有两个文件file1file2,内容如下:

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

也可以看看