Uniq:去重文件
uniq 将给定输入中的唯一行写入,如果没有给定输入或输入名为“-”,则写入标准输入。
语法:
uniq [选项]… [输入 [输出]]
默认情况下,uniq 打印其输入行,但丢弃所有相邻重复行的除第一个之外的所有输出行,因此没有输出行是重复的。可选地,它可以丢弃不重复的行,或者所有重复的行。
输入不需要排序,但只有在相邻的情况下才会检测到重复的输入行。如果你想丢弃非相邻的重复行,也许你想使用 sort -u。
比较遵循由 LC_COLLATE 区域设置类别指定的规则。
如果没有指定输出文件,uniq 将写入标准输出。
选项
‘-f n’
‘–skip-fields=n’
在检查唯一性之前跳过每行的 n 个字段。如果一行的字段数少于 n,则使用空字符串进行比较。字段是由空白字符后跟非空白字符组成的序列。字段编号是基于 1 的,即 -f 1 将跳过第一个字段(该字段可能具有前导空白)。
‘-s n’
‘–skip-chars=n’
在检查唯一性之前跳过 n 个字符。如果一行的字符数少于 n,则使用空字符串进行比较。如果你同时使用字段和字符跳过选项,则首先跳过字段。
在不符合 POSIX 1003.1-2001 的系统上,uniq 支持传统的选项语法 +n。尽管这种传统行为可以通过 _POSIX2_VERSION 环境变量(参见标准符合性)控制,但可移植脚本应避免依赖于此变量的命令。例如,使用 ‘uniq ./+10’ 或 ‘uniq -s 10’ 而不是模糊的 ‘uniq +10’。
‘-c’
‘–count’
打印每行出现的次数。
‘-i’
‘–ignore-case’
忽略比较行时的大小写差异。
‘-d’
‘–repeated’
丢弃不重复的行。当单独使用时,此选项使 uniq 打印每个重复行的第一次副本,然后什么都不打印。
‘-D’
‘–all-repeated[=delimit-method]’
不要丢弃后续重复的输入行,但丢弃不重复的行。此选项主要用于与其他选项结合使用,例如忽略大小写或仅比较选定的字段。可选的 delimit-method,与长格式选项一起支持,指定如何分隔重复行的组,必须是以下之一:
- ‘none’
- 不分隔重复行的组。这与 –all-repeated(-D)相同。
- ‘prepend’
- 在每个重复行的组前输出换行符。使用 –zero-terminated(-z),使用零字节(ASCII NUL)作为分隔符,而不是换行符。
- ‘separate’
- 用单个换行符分隔重复行的组。这与使用 ‘prepend’ 相同,只是没有在第一个组之前插入分隔符,因此可能更适合直接输出给用户。使用 –zero-terminated(-z),使用零字节(ASCII NUL)作为分隔符,而不是换行符。
注意,当组被分隔并且输入流包含空行时,输出是模糊的。为了避免这种情况,通过 ‘tr -s’’ 过滤输入以删除空行。
这是一个 GNU 扩展。
‘–group[=delimit-method]’
输出所有行,并分隔每个唯一组。使用 –zero-terminated(-z),使用零字节(ASCII NUL)作为分隔符。可选的 delimit-method 指定如何分隔组,必须是以下之一:
- ‘separate’
- 用单个分隔符分隔唯一组。这是默认的分隔方法(如果没有指定),并且更适合直接输出给用户。
- ‘prepend’
- 在每个唯一项组前输出分隔符。
- ‘append’
- 在每个唯一项组后输出分隔符。
- ‘both’
- 在每个唯一项组周围输出分隔符。
注意,当组被分隔并且输入流包含空行时,输出是模糊的。为了避免这种情况,通过 ‘tr -s’’ 过滤输入以删除空行。
这是一个 GNU 扩展。
‘-u’
‘–unique’
丢弃重复输入组的最后一行。当单独使用时,此选项使 uniq 打印唯一行,然后什么都不打印。
‘-w n’
‘–check-chars=n’
在每行上最多比较 n 个字符(在跳过任何指定字段和字符之后)。默认情况下,整个其余行都被比较。
‘-z’
‘–zero-terminated’
用零字节分隔项目,而不是换行符(ASCII LF)。即,将输入视为由 ASCII NUL 分隔的项目,并以 ASCII NUL 终止输出项目。这可以与 ‘perl -0’ 或 ‘find -print0’ 以及 ‘xargs -0’ 一起使用,以便可靠地处理任意文件名(即使其中包含空格或其他特殊字符)。请注意,与 -z 一起,换行符被视为字段分隔符。