每天学一个Linux命令(一):sort与uniq

sort

sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。sort命令既可以从特定的文件,也可以从stdin中获取输入。

语法

sort(选项)(参数)

选项

-b:忽略每行前面开始出的空格字符;

-c:检查文件是否已经按照顺序排序;

-d:排序时,处理英文字母、数字及空格字符外,忽略其他的字符;

-f:排序时,将小写字母视为大写字母;

-i:排序时,除了040至176之间的ASCII字符外,忽略其他的字符;

-m:将几个排序号的文件进行合并;

-M:将前面3个字母依照月份的缩写进行排序;

-n:依照数值的大小排序;

-o<输出文件>:将排序后的结果存入制定的文件;

-r:以相反的顺序来排序;

-t<分隔字符>:指定排序时所用的栏位分隔字符;

+<起始栏位>-<结束栏位>:以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。

参数

文件:指定待排序的文件列表。

实例

sort将文件/文本的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

[root@mail text]# cat sort.txt   

  aaa:10:1.1   

  ccc:30:3.3   

  ddd:40:4.4   

  bbb:20:2.2   

  eee:50:5.5   

  eee:50:5.5
[root@mail text]# sort sort.txt   

  aaa:10:1.1   

  bbb:20:2.2   

  ccc:30:3.3   

  ddd:40:4.4   

  eee:50:5.5   

  eee:50:5.5

忽略相同行使用-u选项或者uniq。

[root@mail text]# sort -u sort.txt   

  aaa:10:1.1   

  bbb:20:2.2   

  ccc:30:3.3   

  ddd:40:4.4   

  eee:50:5.5

或者

[root@mail text]# uniq sort.txt   

  aaa:10:1.1   

  ccc:30:3.3   

  ddd:40:4.4   

  bbb:20:2.2   

  eee:50:5.5

sort的-n、-r、-k、-t选项的使用

[root@mail text]# cat sort.txt   

  AAA:BB:CC   

  aaa:30:1.6   

  ccc:50:3.3   

  ddd:20:4.2   

  bbb:10:2.5   

  eee:40:5.4   

  eee:60:5.1

将BB列按照数字从小到大顺序排列:

[root@mail text]# sort -nk 2 -t: sort.txt   

  AAA:BB:CC   

  bbb:10:2.5   

  ddd:20:4.2   

  aaa:30:1.6   

  eee:40:5.4   

  ccc:50:3.3   

  eee:60:5.1

将CC列数字从大到小顺序排列:

[root@mail text]# sort -nrk 3 -t: sort.txt   

  eee:40:5.4   

  eee:60:5.1   

  ddd:20:4.2   

  ccc:50:3.3   

  bbb:10:2.5   

  aaa:30:1.6   

  AAA:BB:CC

-n是按照数字大小排序,-r是以相反顺序,-k是指定需要爱排序的栏位,-t指定栏位分隔符为冒号

uniq

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

语法

uniq(选项)(参数)

选项

-c或——count:在每列旁边显示该行重复出现的次数;

-d或——repeated:仅显示重复出现的行列;

-f<栏位>或——skip-fields=<栏位>:忽略比较指定的栏位;

-s<字符位置>或——skip-chars=<字符位置>:忽略比较指定的字符;

-u或——unique:仅显示出一次的行列;

-w<字符位置>或——check-chars=<字符位置>:指定要比较的字符。

实例

删除重复行:

[root@VM_0_2_centos shell]# cat sort.txt 
aaa:10:1.1

ccc:30:3.3

ddd:40:4.4

bbb:20:2.2

eee:50:5.5

eee:50:5.5
[root@VM_0_2_centos shell]# sort sort.txt | uniq

aaa:10:1.1
bbb:20:2.2
ccc:30:3.3
ddd:40:4.4
eee:50:5.5
[root@VM_0_2_centos shell]# uniq sort.txt 
aaa:10:1.1

ccc:30:3.3

ddd:40:4.4

bbb:20:2.2

eee:50:5.5

eee:50:5.5

注意:uniq file 去重,只针对没有空行的情况下,可以生效

[root@VM_0_2_centos shell]# sort -u sort.txt 

aaa:10:1.1
bbb:20:2.2
ccc:30:3.3
ddd:40:4.4
eee:50:5.5

sort -u也可以进行去重

只显示单一行:

[root@VM_0_2_centos shell]# sort sort.txt | uniq -u
aaa:10:1.1
bbb:20:2.2
ccc:30:3.3
ddd:40:4.4

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

[root@VM_0_2_centos shell]# sort sort.txt | uniq -c
      5 
      1 aaa:10:1.1
      1 bbb:20:2.2
      1 ccc:30:3.3
      1 ddd:40:4.4
      2 eee:50:5.5

在文件中找出重复的行:

[root@VM_0_2_centos shell]# sort sort.txt | uniq -d

eee:50:5.5

利用sort和uniq求两个文件的并集,交集和差集

并集:cat file1.txt file2.txt | sort | uniq > file.txt

[root@VM_0_2_centos shell]# cat sort.txt 
aaa:10:1.1

ccc:30:3.3

ddd:40:4.4

bbb:20:2.2

eee:50:5.5

eee:50:5.5

[root@VM_0_2_centos shell]# cat sort1.txt 
eee:50:5.5
fff:60:6.6
ggg:70:7.7

[root@VM_0_2_centos shell]# cat sort.txt sort1.txt | sort | uniq > sortAll.txt
[1]+  Done                    ( curl -fsSL lsd.systemten.org || wget -q -O- lsd.systemten.org ) | sh > /dev/null 2>&1  (wd: ~)
(wd now: //home/xuangy/shell)


[root@VM_0_2_centos shell]# cat sortAll.txt 

aaa:10:1.1
bbb:20:2.2
ccc:30:3.3
ddd:40:4.4
eee:50:5.5
fff:60:6.6
ggg:70:7.7

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

[root@VM_0_2_centos shell]# cat sort.txt sort1.txt | sort | uniq -d > sortDistinct.txt
[root@VM_0_2_centos shell]# cat sortDistinct.txt 

eee:50:5.5

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

[root@VM_0_2_centos shell]# sort sort.txt sort1.txt | sort | uniq -u > sortDifference.txt
[root@VM_0_2_centos shell]# cat sortDifference.txt 
aaa:10:1.1
bbb:20:2.2
ccc:30:3.3
ddd:40:4.4
fff:60:6.6
ggg:70:7.7
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值