linux之排序sort命令详解

linux之排序sort命令

sort排序规则:
  • 以行为单位,每一行作为一个字符串
  • 按照字符串的比较规则,首字母开始依次向后按ASCII码值进行比较
  • 结果默认升序输出

1. 简单排序

[root@linuxforliuhj test]# cat test.txt 
aaa:cde
bbb:dse
ccc:123
abc:rew
acb:1we
111:fdf
222:esa
333:iud
[root@linuxforliuhj test]# sort test.txt
111:fdf
222:esa
333:iud
aaa:cde
abc:rew
acb:1we
bbb:dse
ccc:123

使用sort进行简单排序,首字母开始依次进行比较。

2. 排序后去除重复的行,使用参数-u(unique)

[root@linuxforliuhj test]# cat test.txt 
aaa:cde
aaa:cde
bbb:dse
ccc:123
abc:rew
abc:rew
abc:rew
acb:1we
111:fdf
222:esa
333:iud
[root@linuxforliuhj test]# sort -u test.txt
111:fdf
222:esa
333:iud
aaa:cde
abc:rew
acb:1we
bbb:dse
ccc:123

排序后将重复的行aaa:cde和abc:rew去重只保留一行。

3.默认排序为升序排序,使用参数-r进行降序排序

[root@linuxforliuhj test]# cat test.txt    
aaa:cde
aaa:cde
bbb:dse
ccc:123
abc:rew
abc:rew
abc:rew
acb:1we
111:fdf
222:esa
333:iud
[root@linuxforliuhj test]# sort -u -r test.txt
ccc:123
bbb:dse
acb:1we
abc:rew
aaa:cde
333:iud
222:esa
111:fdf

进行降序排序,同时去除重复项。

4.将排序结果输出到指定文件,使用参数-o(out)

[root@linuxforliuhj test]# sort -u -r test.txt -o /test/test_1.txt
[root@linuxforliuhj test]# cat test_1.txt 
ccc:123
bbb:dse
acb:1we
abc:rew
aaa:cde
333:iud
222:esa
111:fdf

将排序的结果输出到文件test_1.txt文件中,如果输出文件不存在会自动创建。同时也可以使用重定向符号进行输出。

[root@linuxforliuhj test]# sort -u -r test.txt > /test/test_2.txt
[root@linuxforliuhj test]# cat test_2.txt 
ccc:123
bbb:dse
acb:1we
abc:rew
aaa:cde
333:iud
222:esa
111:fdf

参数-o和重定向符号的唯一区别:
当使用重定向符号将排序结果重定向输出回源文件进行覆盖时,会出错,源文件会被清空。
当使用-o参数时,则能够正常覆盖回源文件。

[root@linuxforliuhj test]# sort -u -r test.txt > /test/test.txt
[root@linuxforliuhj test]# ll -d /test/test.txt
-rw-r--r--. 1 root root 0 Oct 25 20:06 /test/test.txt
[root@linuxforliuhj test]# cat test.txt
[root@linuxforliuhj test]# 
[root@linuxforliuhj test]# sort -u -r test.txt -o /test/test.txt 
[root@linuxforliuhj test]# cat test.txt
ccc:123
bbb:dse
acb:1we
abc:rew
aaa:cde
333:iud
222:esa
111:fdf
[root@linuxforliuhj test]#

5.以数值进行比较,而并非字符串,使用参数-n(number)

[root@linuxforliuhj test]# cat test_n.txt  
12322
54
735
9
[root@linuxforliuhj test]#
[root@linuxforliuhj test]# sort test_n.txt
12322
54
735
9
[root@linuxforliuhj test]# sort -n test_n.txt 
9
54
735
12322

未使用-n参数则从首字母开始依次进行排序;使用-n参数后则按照数值进行排序;此参数只适用于纯数字字符串

6.将每一行按照指定字符分割以后,选择其中的某一列进行排序,使用-t参数指定分割符,使用-k参数指定按照分割后的哪一列进行排序。

[root@linuxforliuhj test]# cat test.txt                
asd:34w:dsw
ccc:123:343
bbb:123:dfe
aab:1we:hiu
abc:lwe:htt
aaa:cde:lpu
333:esa:qas
222:esa:ase
111:fdf:cxs

以:分割每一行并按照第1列进行排序

[root@linuxforliuhj test]# sort -t ':' -k 1 test.txt  
111:fdf:cxs
222:esa:ase
333:esa:qas
aaa:cde:lpu
aab:1we:hiu
abc:lwe:htt
asd:34w:dsw
bbb:123:dfe
ccc:123:343

以:分割每一行并按照第2列进行排序

[root@linuxforliuhj test]# sort -t ':' -k 2 test.txt
ccc:123:343
bbb:123:dfe
aab:1we:hiu
asd:34w:dsw
aaa:cde:lpu
222:esa:ase
333:esa:qas
111:fdf:cxs
abc:lwe:htt

以:分割每一行并按照第3列进行排序

[root@linuxforliuhj test]# sort -t ':' -k 3 test.txt
ccc:123:343
222:esa:ase
111:fdf:cxs
bbb:123:dfe
asd:34w:dsw
aab:1we:hiu
abc:lwe:htt
aaa:cde:lpu
333:esa:qas

7.sort命令适用于管道符

[root@linuxforliuhj test]# cat test.txt
ccccc
bdsdsad
adsfwe
gdgsdf
we
w

dsafswqeqw
jhhtyty
[root@linuxforliuhj test]# cat test.txt | sort

adsfwe
bdsdsad
ccccc
dsafswqeqw
gdgsdf
jhhtyty
w
we
[root@linuxforliuhj test]# cat test.txt | sort -r
we
w
jhhtyty
gdgsdf
dsafswqeqw
ccccc
bdsdsad
adsfwe

[root@linuxforliuhj test]#

8.注意

注意:
【1】sort还有一些其他的不常用的参数,例如-f,-b , -c, -C等
【2】sort默认是使用-b参数的,即默认删除每一行之前的空格,从第一个非空格数据开始比较

[root@linuxforliuhj test]# cat te.txt 
hello this is
 hello this is
hellothis is
hello this a
[root@linuxforliuhj test]# sort te.txt      
hello this a
 hello this is
hello this is
hellothis is

可以看出默认的sort命令忽略每一行第一个字符之前的空格,而并非整行所有的空格!

9.忽略大小写参数-f引发的奇怪现象

[root@linuxforliuhj test]# cat hello.sh 
A
a
B
b
d
D
e
E
[root@linuxforliuhj test]# sort hello.sh    
a
A
b
B
d
D
e
E
[root@linuxforliuhj test]# sort -f hello.sh 
A
a
B
b
D
d
E
e

目前查了很多资料还不清楚具体是什么原因,所以尽量不要用-f参数,可以使用tr等命令进行大小写替换后再排序!

  • 7
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Operose-honeybee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值