Linux命令之——sort、uniq

Linux命令之——sort、uniq

其他文章:


sort 命令

将文件/文本的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将排序结果标准输出。
既可以从特定的文件,也可以从 stdin 中获取输入。
sort [选项] [文件s]

选项

  • -b:忽略每行前面开始出的空格字符(空格数不固定时,该选项几乎是必用的);   
  • -c:检查文件是否已经按照顺序排序,如未排序,会提示从哪一行开始乱序;   
  • -C:类似于-c,只不过不输出任何诊断信息。可以通过退出状态码1判断出文件未排序
  • -d:排序时,只处理英文字母、数字及空格字符外,忽略其他的字符;  
  • -f:排序时,将小写字母视为大写字母;   
  • -h:使用易读性数字(例如:2K、1G)
  • -i:排序时,除了040至176之间的ASCII字符(八进制0-177)外,忽略其他的字符(忽略无法打印的字符如退格/换页键/回车);
  • -k:以哪个区间 (field) 来进行排序
  • -m:将几个排序好的文件进行合并,只是单纯合并,不做排序;   
  • -M:将前面3个字母依照月份的缩写进行排序;   
  • -n:依照数值的大小排序;   
  • -o<输出文件>:将排序后的结果存入制定的文件;   
  • -r:降序;   
  • -u:忽略相同行
  • -t<分隔字符>:指定分隔符,默认的分隔符为空白字符和非空白字符之间的空字符;
  • +<起始栏位>-<结束栏位>:以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。

实例

简单排序

# 原样输出
cat /etc/passwd
# 升序输出
sort /etc/passwd
# 升序输出且忽略相同
sort -u /etc/passwd

将第3列按照数字从小到大顺序排列

sort -nk 3 -t: /etc/passwd

## 倒序
sort -nrk 3 -t: /etc/passwd

uniq 命令

用于报告或忽略文件中的重复行,一般与 sort 命令结合使用。
uniq [选项] [文件s]

选项

  • -c——count:  在每列旁边(前面)显示该行重复出现的次数;   
  • -d--repeated:  仅显示重复出现的行列;   
  • -f<栏位>--skip-fields=<栏位>:忽略比较指定的栏位;
  • -s<字符位置>--skip-chars=<字符位置>:忽略比较指定的字符;
  • -u——unique:仅显示出一次的行列;   
  • -w<字符位置>--check-chars=<字符位置>:指定要比较的字符。

实例

删除重复行

uniq file.txt   

sort file.txt | uniq   

sort -u file.txt

只显示单一行

uniq -u file.txt   

sort file.txt | uniq -u

统计各行在文件中出现的次数

sort file.txt | uniq -c

在文件中找出重复的行

sort file.txt | uniq -d

sort 和 uniq

sort 和 uniq 可结合使用求集合

并集

cat file1.txt file2.txt | sort | uniq > file.txt

交集

cat file1.txt file2.txt | sort | uniq -d >file.txt

差集
求file1.txt相对于file2.txt的差集,可先求出两者的交集temp.txt,然后在file1.txt中除去temp.txt即可。

cat file1.txt file2.txt | sort | uniq -d >temp.txt
cat file1.txt temp.txt | sort | uniq -u >file.txt

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://halo.sherlocky.com/archives/linuxsortuniq

Buy me a cup of coffee ☕.