大文件sort排序优化

sort命令排序文本文件内容的多种方式:按月,按数值,随机,按ASCII

去除重复行
sort file |uniq

查找非重复行
sort file |uniq -u

查找重复行
sort file |uniq -d

统计
sort file | uniq -c

Linux sort命令可以以比你可能意识到的更多的方式来排列命令输出或文件内容-按字母,数字,按月和随机方式只是更有趣的选择之一。
在本文中,我们将介绍一些更有用的排序选项,并说明它们之间的区别。

默认值
默认排序似乎很简单。首先是数字,然后是字母,对于每个字母,小写字母都在大写字母之前。您可以期望看到这种排序:
012345aAbBcCdDeE

ASCII顺序
查看这些字母中每个字母的数字字节值,您可能会注意到,就ASCII而言,上面看到的不是“自然顺序”。

# echo 012345aAbBcCdDeE | od -bc
0000000 060 061 062 063 064 065 141 101 142 102 143 103 144 104 145 105
0 1 2 3 4 5 a A b B c C d D e E
0000020 012
\n
0000021

您会在此八进制转储字符列表中注意到,大写字母的ASCII值较低,如果以ASCII顺序列出,则大写字母将位于小写字母之前。为了按字节值,在前面加上你的排序,排序与命令LC_ALL = C。例如,以下是按字节顺序排序与默认排序顺序的比较:

$ LC_ALL=C sort file $ sort file
0 0
1 1
2 2
3 3
4 4
5 5
A <== a <==
B <== A <==
C b
D B
E c
a C
b d
c D
d e
e E

数值顺序
要进行数字排序,您需要使用-n,否则最终将按字符对数字排序,并且100会假装小于2。这是默认排序和数字排序之间的比较:

$ sort numbers $ sort -n numbers
0 0
1 1
11 4
4 9
44 11
9 44

您还可以使用“人性化”排序顺序进行数字排序。这使您可以用数字以外的数字来表示数字,例如5M。该排序顺序的选项是-h。使用它时,将5K视为大于500且小于5M。这是默认排序和人性化排序的比较:

$ sort numbers $ sort -h numbers
0 0
1 1
11 4
4 9
44 11
500 44
5K 500
5M 5K
9 5M

按月
要按月份名称排序,可以使用-M选项。这是默认排序和按月排序的示例:

$ sort months # sort -M months
Apr Jan
Aug Feb
Dec Mar
Feb Apr
Jan May
Jul Jun
Jun Jul
Mar Aug
May Sep
Nov Oct
Oct Nov
Sep Dec

请注意,无论你拼写月份名称还是使用缩写,都可以按月份排序:
$ sort -M months2
Jan
Feb
March
Apr
May
June
Jul
August
Sep
October
November
Dec

了解按月排序不是按日期排序。该排序选项假定所有月份都在同一年。
$ sort events $ sort -M events
Feb 10 2020 20:06 SOMETHING Jan 23 2020 10:42 SOMETHING
Feb 11 2020 20:06 SOMETHING Jan 29 2020 09:17 SOMETHING
Feb 12 2019 11:11 SOMETHING Feb 10 2020 20:06 SOMETHING
Feb 27 2020 23:05 SOMETHING Feb 11 2020 20:06 SOMETHING
Jan 23 2020 10:42 SOMETHING Feb 12 2019 11:11 SOMETHING <==
Jan 29 2020 09:17 SOMETHING Feb 27 2020 23:05 SOMETHING <==
Jun 26 2019 09:09 SOMETHING Jun 26 2019 09:09 SOMETHING

反向排序
要颠倒排序列表的顺序,请添加-r选项。

$ sort -Mr months $ sort -hr numbers
Dec 5M
Nov 5k
Oct 500
Sep 44
Aug 11
Jul 9
Jun 4
May 1
Apr 0
Mar
Feb
Jan

随机排序
要以伪随机方式对文本进行排序,请在排序命令中使用-R。以下是一些使用random选项的较早排序。

$ sort -R months $ sort -R numbers
Aug 500
Nov 4
Dec 44
Sep 5M
Apr 0
Jan 1
Jul 5K
Jun 11
May 9
Mar
Feb
Oct
随机排序数据的另一种方法是使用shuf(用于“ shuffle”)命令。这是几个示例,这些示例使用了本文中较早示例的数据:

$ shuf months $ shuf numbers
Nov 0
Jun 4
May 500
Aug 5K
Apr 11
Dec 44
Jul 1
Feb 9
Mar 5M
Oct
Sep
Jan

排序命令输出
您还可以将数据通过管道传递给显示的任何排序命令。下面的命令可能不是特别有用,但是它说明了这一点并显示了与排序有关的其他命令。
通过apropos命令找到其他排序相关的命令:

# apropos sort | sort -r
tsort (1) – perform topological sort
sort (3pm) – perl pragma to control sort() behaviour
sort (1) – sort lines of text files
grub2-rpm-sort (8) – Sort input according to RPM version compare.
comm (1) – compare two sorted files line by line
bzip2 (1) – a block-sorting file compressor, v1.0.6
bunzip2 (1) – a block-sorting file compressor, v1.0.6