首页 > 技术文章 > 面试官都在问 | 讲一下Linux中的sort命令

daanzhijia 2020-10-26 15:44 原文

面试官都在问 | 讲一下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命令可以对文本内容进行排序
  • 如何指定文本内容各列之间的分隔符
  • 如何对文本内容进行升序或降序排序
  • 如何对文本内容进行忽略大小写进行排序
  • 如何对文本内容按照指定列进行排序
  • 如何对文本内容排序后的结果进行去重

在这里插入图片描述

推荐阅读