「uniq(1)」-

报告或者忽略重复的行

命令语法格式

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 ./+10uniq -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参数,并且取值必须是以下之一:

none
不要划分重复行的组。这相当于–all-repeated(-D),即未指定delimit-method的默认值。

prepend
在每组重复行之前输出一个换行符(ASCII LF)。可以使用–zero-terminated(-z)来使用零字节(ASCII NUL)而不是换行符来作为分隔符。

separate
使用单个换行符(ASCII LF)分隔重复行组。这与使用’prepend’相同,但是在第一个重复组之前没有插入换行符号,因此可能更适合直接输出给用户。使用–zero-terminated(-z),使用零字节(ASCII NUL)而不是换行符作为分隔符。

请注意,当组已经被分隔,并且输入流包含空行时,会导致输出不明确。为避免这种情况,请通过tr -s ‘\n’过滤输入数据来以删除空行。

这是一个GNU扩展。

–group[=delimit-method]
输出所有行,并分隔每个唯一的组。指定–zero-terminated(-z)选项,可以使用零字节(ASCII NUL)而不是换行符作为分隔符。可选的delimit-method指定如何分组组,并且取值必须是以下之一:

separate
使用单个分隔符分隔唯一组。如果未指定,则这是默认的分隔方法,更适合直接输出给用户。

prepend
在每组唯一项之前输出分隔符。

append
在每组唯一项后输出分隔符。

both
在每组唯一项后输出分隔符。

请注意,当组已经分隔,并且输入流包含空行时,此时输出不明确。为避免这种情况,请通过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 创建文章