面试官都在问 | 讲一下Linux中的sort命令
0. 概述
在我们面试各大公司的时候,关于Linux往往最容易被问到的问题之一就是Linux指令,而其中,使用命令对文件内容进行排序,又是相对比较容易被问到的。因为对这些参数的了解,最能直观反映应聘者对Linux环境是否熟悉。我们结合海量面经,提取出几个最容易被问到的Linux对文件内容进行排序的命令,供大家参考。
- 如何对文件中内容指定分隔符后按照指定列进行内容排序
- 如何对排序好的文件进行合并
- 如何对文件内容忽略大小写进行排序
- 如何指定排序方式为降序或升序
- 如何对排序的结果进行去重
1. Linux命令之 sort
1.1 简述
sort
命令可以针对文本文件的内容,按行进行排序。在排序的时候以指定分隔符对文本文件进行内容分列。对指定列进行升序或降序排列,并且在排序的同时可以指定是否忽略大小写。
1.2 高频选项
sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件]
-b:忽略每行前面开始的空格字符,空格数量不固定时,该选项几乎是必须要使用的
-f:将小写字母视为大写字母
-h:使用易读性数字(例如:2K、1G)
-k:以哪个区间 (field) 来进行排序
-n:依照数值的大小排序
-o<输出文件>:将排序后的结果存入指定的文件
-r:降序
-u:忽略相同行
-t<分隔字符>:指定分隔符,默认的分隔符为空白字符和非空白字符之间的空字符
--help 显示帮助。
--version 显示版本信息。
1.3 sort
命令
sort
命令默认以制表符tab
键或者空格作为间隔符,并且先按照第一列进行排序
[san@San doc]$ cat test.txt
1 公司名称 人数 平均工资
2 google 1000 20000
4 facebook 1000 19000
3 apple 1300 25000
[san@San doc]$ sort test.txt
1 公司名称 人数 平均工资
2 google 1000 20000
3 apple 1300 25000
4 facebook 1000 19000
1.4 sort
命令之 -r
选项
-r
选项功能为对使用降序方式,对内容进行排序
[san@San doc]$ sort test.txt
2 google 1000 20000
3 apple 1300 25000
4 facebook 1000 19000
[san@San doc]$ sort test.txt -r
4 facebook 1000 19000
3 apple 1300 25000
2 google 1000 20000
1.5 sort
命令之 -n
选项
-n
对指定列按照数值大小进行排序(默认情况下按照字符进行排序)
[san@San doc]$ sort test.txt
2000 google 1000 20000
300 apple 2600 15000
4000 facebook 1000 19000
500 tencent 500 18000
[san@San doc]$ sort test.txt -n
300 apple 2600 15000
500 tencent 500 18000
2000 google 1000 20000
4000 facebook 1000 19000
1.4 sort
命令之 -k
选项
-k
选项可以指定按照分列后的第n列进行排序,但是要注意若指定列相同的话,sort
会自动的针对其他列进行排序。
[san@San doc]$ cat test.txt
2 google 1000 20000
5 tencent 500 18000
4 facebook 1000 19000
3 apple 1300 25000
[san@San doc]$ sort test.txt -k 2
3 apple 1300 25000
4 facebook 1000 19000
2 google 1000 20000
5 tencent 500 18000
可以从示例中看出,文本内容按照公司名称(也就是第2列)进行了排序
[san@San doc]$ cat test.txt
2 google 1000 20000
3 apple 2600 15000
7 apple 2600 15000
5 apple 2600 15000
[san@San doc]$ sort test.txt -k 2
3 apple 2600 15000
5 apple 2600 15000
7 apple 2600 15000
2 google 1000 20000
[san@San doc]$ sort test.txt -k 2 -k 1nr
7 apple 2600 15000
5 apple 2600 15000
3 apple 2600 15000
2 google 1000 20000
从示例中可以看出,若指定列相同的情况下,可以继续使用-k
选项指定第二个列进行比对
注意:第一次按照第一个列排序完毕后,sort
会自动的对相同的指定列进行其他列的排序;
apple
原先的序号为(3、7、5)按照第二列apple
排序后,同时自动对第一列也进行了排序(3、5、7)
这时候可以再次使用-k
选项第二次针对第一列进行降序排列
注意:-r
以及 -n
选项单独使用,则作用于全局; 若放在指定列后,则仅作用于指定列
1.4 sort
命令之 -t
选项
-t
选项功能为以指定分隔符对文本内容进行分列
[san@San doc]$ cat test.txt
1:公司名称:公司人数:平均工资
2:google:1000:20000
5:tencent:1100:18000
4:facebook:1000:23000
3:apple:1300:25000
[san@San doc]$ sort test.txt -k 4
1:公司名称:公司人数:平均工资
2:google:1000:20000
3:apple:1300:25000
4:facebook:1000:23000
5:tencent:1100:18000
[san@San doc]$ sort test.txt -t ':' -k 4
5:tencent:1100:18000
2:google:1000:20000
4:facebook:1000:23000
3:apple:1300:25000
1:公司名称:公司人数:平均工资
从示例中可以看出,在不指定列分隔符的时候,按照平均工资(文本内容以 :
分隔后的第四列)进行排序的结果并未达到预期效果,然而使用 -t
选项指定分隔符后排序成功。
1.5 sort
命令之 -f
选项
-f
将小写字符作为大写字母进行比较;(忽略大小写进行排序)
[san@San doc]$ sort test.txt -k 2
2 google 1600 18000
6 GOOGLE 1600 18000
[san@San doc]$ sort test.txt -k 2 -k 1
2 google 1600 18000
6 GOOGLE 1600 18000
[san@San doc]$ sort test.txt -k 2 -k 1r
2 google 1600 18000
6 GOOGLE 1600 18000
[san@San doc]$ sort test.txt -k 2 -k 1r -f
6 GOOGLE 1600 18000
2 google 1600 18000
注意:从示例中可以看出,sort
中针对第二列进行了排序,排序后再针对第一列进行升序排序或者降序排序,但是都没有产生效果,然而使用 -f
选项后,产生效果,因为这时候字符的比较统一作为大写进行比较了。
1.6 sort
命令之 -h
选项
-h
选项功能为遇到易读性字符时,则作为数值进行比较(例如:2K、1G)
[san@San doc]$ cat test.txt
2 google 1600 18000 1G
6 GOOGLE 1600 18000 5M
1 BITE 1600 18000 10T
3 apple 1600 18000 3k
[san@San doc]$ sort test.txt -k 5
1 BITE 1600 18000 10T
2 google 1600 18000 1G
3 apple 1600 18000 3k
6 GOOGLE 1600 18000 5M
[san@San doc]$ sort test.txt -h -k 5
3 apple 1600 18000 3k
6 GOOGLE 1600 18000 5M
2 google 1600 18000 1G
1 BITE 1600 18000 10T
从示例中可以看出,第一次比较的时候时根据字符进行比较,结果并未达到预期;
然而增加 -h
选项后,则认为K/M/G/T
是一些易读性的数字单位,转换成为数值后进行比较。
1.7 sort
命令之 -u
选项
-u
选项功能为对匹配结果进行去重。
[san@San doc]$ cat test.txt
2 google 1600 18000 1G
6 GOOGLE 1700 18000 5M
1 BITE 1500 18000 10T
3 apple 1600 18000 3k
[san@San doc]$ sort test.txt -k 3n
1 BITE 1500 18000 10T
2 google 1600 18000 1G
3 apple 1600 18000 3k
6 GOOGLE 1700 18000 5M
[san@San doc]$ sort test.txt -u -k 3n
1 BITE 1500 18000 10T
2 google 1600 18000 1G
6 GOOGLE 1700 18000 5M
从示例中看出,-u
选项使用哦给之后,则对第三列进行了去除重复的行。
1.8 sort
命令之 -o
选项
-o
选项功能为,将排序结果写入到指定的输出文件中,而并不进行打印。
[san@San doc]$ sort test.txt -u -k 3n -o result.txt
[san@San doc]$ ls
result.txt test.txt
[san@San doc]$ cat result.txt
1 BITE 1500 18000 10T
2 google 1600 18000 1G
6 GOOGLE 1700 18000 5M
2. 总结
- 使用
sort
命令可以对文本内容进行排序 - 如何指定文本内容各列之间的分隔符
- 如何对文本内容进行升序或降序排序
- 如何对文本内容进行忽略大小写进行排序
- 如何对文本内容按照指定列进行排序
- 如何对文本内容排序后的结果进行去重