目录
34. shell命令--uniq
功能说明
uniq 是 Linux 和 Unix 系统上的一个常用命令,用于从排序过的文本中删除重复的行。这意味着在使用 uniq 之前,你通常需要对输入文本进行排序(通常使用 sort 命令)。
uniq 命令来自英文单词 unique 的缩写,中文译为“独特的、唯一的”,其功能是去除文件中的重复内容行。uniq 命令能够去除掉文件中相邻的重复内容行,如果两端相同内容,但中间夹杂了其他文本行,则需要先使用 sort 命令进行排序后再去重,这样保留下来的内容就都是唯一的了。
语法格式
SYNOPSIS
uniq [OPTION]... [INPUT [OUTPUT]]
选项说明
-c, --count 在每行开头增加重复次数。
-d, --repeated 所有邻近的重复行只被打印一次。
-D 所有邻近的重复行将全部打印。
--all-repeated[=METHOD] 类似于 -D,但允许每组之间以空行分割。METHOD取值范围{none(默认),prepend,separate}。
-f, --skip-fields=N 跳过对前N个列的比较。
--group[=METHOD] 显示所有行,允许每组之间以空行分割。METHOD取值范围:{separate(默认),prepend,append,both}。
-i, --ignore-case 忽略大小写的差异。
-s, --skip-chars=N 跳过对前N个字符的比较。
-u, --unique 只打印非邻近的重复行。
-z, --zero-terminated 设置行终止符为NUL(空),而不是换行符。
-w, --check-chars=N 只对每行前N个字符进行比较。
--help 显示帮助信息并退出。
--version 显示版本信息并退出。
实践操作
0. 环境准备
mkdir -p /test/uniq
cd /test/uniq
echo {a..d} {1..3} {b..g} {1..3} {c..k}
echo {a..d} {1..3} {b..g} {1..3} {c..k} |tr " " "\n" >file1.txt
cat file1.txt
echo -e "test 3\ntest 3\ntest 3\nlinux 2\nlinux 2" >file2.txt
cat file2.txt
1. 对指定的文件进行去重操作
uniq file1.txt #无法直接去重
uniq file2.txt #可以直接去重
sort file1.txt |uniq #先排序,后去重
sort -u file1.txt
sort file1.txt |uniq |wc -l
uniq file1.txt |wc -l
2. 统计相同内容行在文件中重复出现的次数
sort file1.txt |uniq -c
uniq -c file2.txt
cat /etc/passwd
cat /etc/passwd |tr ':' '\n'
cat /etc/passwd |tr ':' '\n' |sort
cat /etc/passwd |tr ':' '\n' |sort |uniq -c
cat /etc/passwd |tr ':' '\n' |sort |uniq -c |sort -rn
cat /etc/passwd |tr ':' '\n' |sort |uniq -c |sort -rn |wc -l
cat /etc/passwd |tr ':' '\n' |wc -l
#这里,tr ':' '\n' 将文件中的所有空格替换为换行符,从而将每个单词转换为其自己的行。
#然后,我们使用 sort、uniq 和 sort -nr 来计算并显示每个单词的出现次数(按降序排列)。
3. 仅显示指定文件中没有存在完全相同内容行的信息(只显示单一行,区别在于是否执行排序)
sort file1.txt |uniq -u
uniq -u file2.txt
4. 仅显示指定文件中存在完全相同内容行的信息
sort file1.txt |uniq -d
uniq -d file2.txt
注意事项
- uniq 命令仅对连续重复的行有效。这就是为什么在使用它之前通常需要先进行排序。
- 如果你不指定输出文件,则默认输出到标准输出(通常是终端或另一个命令的输入)。
- 你可以将多个选项组合在一起使用,例如 uniq -cd file.txt。