uniq 命令会把每一输入行与前一行比较。它可以折叠、计数或选择相邻的相同行组,但不会在整个文件中查找彼此分隔的重复项。
文本操作 · 第 14 课
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 可以跳过或限制比较区域;只有当相等关系应由每行的一部分定义时才使用它们。
要练习对重复项进行分组、计数和筛选,可以尝试以下动手实验:
- Linux uniq 命令:重复项筛选 - 学习结合使用 Linux
uniq与sort命令,识别、筛选和分析文本文件中的重复行。 - Linux sort 命令:文本排序 - 练习使用
sort整理文本文件中的行,这是有效使用uniq前的关键步骤。 - 单词计数和排序 - 在动手挑战中学习重要的 Linux 文本处理工具
wc和sort,统计行、单词和字符,查找常见模式并高效排列数据。
课程已完成
你已完成 uniq(去重)
现在,你可以使用 uniq 分析相邻的相同行组。
把每个相邻重复组折叠为一行。
使用
-c统计连续出现次数。使用
-u选择单行组。使用
-d或 GNU-D选择重复组。需要聚合彼此分隔的重复项时先排序。