uniq(去重)
100%

文本操作 · 第 14 课

uniq(去重)

学习如何使用 uniq 折叠、计数或筛选相邻的相同行组。

uniq 命令会把每一输入行与前一行比较。它可以折叠、计数或选择相邻的相同行组,但不会在整个文件中查找彼此分隔的重复项。

折叠相邻重复行

假设 reading.txt 包含已经分组的值:

book
book
paper
paper
article
article
magazine

不带筛选选项运行 uniq,会从每个相邻组中输出一行作为代表:

$ uniq reading.txt
book
paper
article
magazine

结果写入 stdout,因此输入文件保持不变。

默认情况下,uniq reading.txt 会做什么?

对相邻组计数

使用 -c 可在每个输出组前加上该组连续输入行的数量:

$ uniq -c reading.txt
      2 book
      2 paper
      2 article
      1 magazine

这些数字是连续组的长度;只有先让所有相同行相邻,它们才是全局总数。

uniq -c 输出的计数表示什么?

选择唯一组或重复组

使用 -u 只输出恰好包含一行的组:

$ uniq -u reading.txt
magazine

使用 -d 从每个包含多于一行的相邻组中输出一行作为代表:

$ uniq -d reading.txt
book
paper
article

GNU uniq -D 会输出重复组中的每一行,而小写的 -d 只输出每个重复组的值一次。

哪个命令只输出恰好出现一次的相邻组?

哪个命令会为每个出现多于一次的相邻组输出一行?

对彼此分隔的重复项分组

如果相同行彼此分隔,它们会形成不同的组:

book
paper
book
paper
article
magazine
article

对该文件运行 uniq 会得到看似意外的结果:

$ uniq reading.txt
book
paper
book
paper
article
magazine
article

由于相邻的值都不同,没有任何行被折叠。如果允许改变顺序,并希望把完全相同的行聚在一起,请先排序:

$ sort reading.txt | uniq
article
book
magazine
paper

两个步骤应使用一致的 locale 和比较规则。sort -u reading.txt 也可以在一个命令中完成排序,并为每个相等的排序键保留一行。

reading.txt 中的相同行散布在不同位置,且允许改变输出顺序。哪个管道会为每个不同的完整行生成一份已排序副本?

未指定输入文件时,uniq 会读取 stdin,因此它很适合接在 sort 后面。GNU 的 -i 可以忽略大小写,而 -f-s-w 可以跳过或限制比较区域;只有当相等关系应由每行的一部分定义时才使用它们。

要练习对重复项进行分组、计数和筛选,可以尝试以下动手实验:

  1. Linux uniq 命令:重复项筛选 - 学习结合使用 Linux uniqsort 命令,识别、筛选和分析文本文件中的重复行。
  2. Linux sort 命令:文本排序 - 练习使用 sort 整理文本文件中的行,这是有效使用 uniq 前的关键步骤。
  3. 单词计数和排序 - 在动手挑战中学习重要的 Linux 文本处理工具 wcsort,统计行、单词和字符,查找常见模式并高效排列数据。

课程已完成

你已完成 uniq(去重)

现在,你可以使用 uniq 分析相邻的相同行组。

  • 把每个相邻重复组折叠为一行。

  • 使用 -c 统计连续出现次数。

  • 使用 -u 选择单行组。

  • 使用 -d 或 GNU -D 选择重复组。

  • 需要聚合彼此分隔的重复项时先排序。

保存学习进度

创建免费账户即可保存本课进度,并在任意设备上继续学习。

创建免费账户
下一节
返回 文本操作