报告或者忽略重复的行
命令语法格式
uniq [OPTION]… [INPUT [OUTPUT]]
命令描述
命令uniq用于打印输入文件INPUT中唯一的行,可以用于行级别的去重操作。
如果没有指定INPUT或者INPUT为‘-’,则从标准输入中读取数据。如果没有指定输出文件OUTPUT,则将结果打印到标准输出中。
默认情况下,命令uniq打印其输入文件中的行,但它会丢弃连续重复行中除第一行以外其他的行,因此不会重复输出行。通过指定选项,它可以丢弃不重复的行,或丢弃所有重复的行。
输入数据不需要排序,但只有当它们相邻时,才会被检测为重复行。如果要丢弃不相邻的重复行,可能要使用sort -u进行排序。参见sort(1)手册。
比较的过程遵循LC_COLLATE语言环境类别指定的规则。
命令支持的选项及含义
需要提供给长选项的参数也必须提供给相应的短选项。
–help
显示帮助并退出。
–version
显示版本信息。
-f n, –skip-fields=n
在检查唯一性之前,跳过每行上的n个字段。如果一行少于n个字段,则会跳过所有的字段,然后使用空字符串进行比较。字段是由非空格非制表符的序列组成,它们之间通过至少一个空格或制表符彼此分开。
为了兼容性,uniq支持传统的-n选项语法。新脚本应该使用-f n代替。
-s n, –skip-chars=n
在检查唯一性之前,跳过每行行的n个字符。如果一行少于n个字符,则使用空字符串进行比较。如果同时使用字段(-f)和字符(-s)跳过选项,则会先进行字段跳过。
在不符合POSIX 1003.1-2001的系统上,uniq支持传统的+n选项语法。尽管可以使用_POSIX2_VERSION环境变量控制此传统行为(请参阅「标准一致性」),但可移植脚本应避免其行为依赖于此变量的命令。例如,应该使用uniq ./+10或uniq -s 10,而不是模糊的uniq +10,因为在此时+10可能是一个文件名,也可能是一个字符跳过的选项。
-c, –count
在每行的开始输出该行重复的次数,同重复次数进行统计。
-i, –ignore-case
在执行比较的时候忽略大小写差异。
-d, –repeated
丢弃不重复的行,仅打印那些重复行的第一行。与此相反的是-u选项。
-u, –unique
只打印那些唯一存在的行。单独使用时,此选项会使uniq打印唯一的行,而不会打印任何其他行。于此相反的是-d选项。
-D, –all-repeated[=delimit-method]
不要丢弃重复的输入行,而是丢弃不重复的行,即打印所有的重复行。该选项主要与其他选项结合使用,例如,忽略大小写或仅比较所选字段。
由长选项支持的delimit-method参数指定如何分隔重复行的组,-D选项不支持delimit-method参数,并且取值必须是以下之一:
请注意,当组已经被分隔,并且输入流包含空行时,会导致输出不明确。为避免这种情况,请通过tr -s ‘\n’过滤输入数据来以删除空行。
这是一个GNU扩展。
–group[=delimit-method]
输出所有行,并分隔每个唯一的组。指定–zero-terminated(-z)选项,可以使用零字节(ASCII NUL)而不是换行符作为分隔符。可选的delimit-method指定如何分组组,并且取值必须是以下之一:
请注意,当组已经分隔,并且输入流包含空行时,此时输出不明确。为避免这种情况,请通过tr -s ‘\n’过滤输入数据以删除空行。
这是一个GNU扩展。
-w n, –check-chars=n
在每行中,最多比较n个字符(在跳过任何指定的字段和字符后)。默认情况下,将比较行中剩余的所有内容。
-z, –zero-terminated
使用零字节(ASCII NUL)而不是换行符(ASCII LF)分隔项目。即,将输入视为由ASCII NUL分隔的项目,并使用ASCII NUL终止输出项目。
此选项可与’perl -0’或’find -print0’和’xargs -0’结合使用,它们可以相同地处理任意文件名(甚至包含空格或其他特殊字符的文件名)。
请注意使用了-z选项之后,换行符(ASCII LF)会被视为字段的分隔符。
退出状态
退出状态为零表示成功,非零值表示失败。
相关手册
comm(1), join(1), sort(1)
查看在线手册:http://www.gnu.org/software/coreutils/uniq
查看info手册:info ‘(coreutils) uniq invocation’
参考文献
- man 1 uniq, version GNU coreutils 8.28
更新日志
- 07/05/2018 创建文章