linux在命令行用sort进行排序
这篇文章主要讲解了"linux在命令行用sort进行排序",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"linux在命令行用sort进行排序"吧!
安装
你不必安装 sort
,因为它向来都包含在 POSIX 系统里。在大多数 Linux 系统中,sort
命令来自 GNU 组织打包的实用工具集合中。在其他的 POSIX 系统中,像 BSD 和 Mac,默认的 sort
命令不是 GNU 提供的,所以有一些选项可能不一样。本文中我尽量对 GNU 和 BSD 两者的实现都进行说明。
按字母顺序排列行
sort
命令默认会读取文件每行的第一个字符并对每行按字母升序排序后输出。两行中的第一个字符相同的情况下,对下一个字符进行对比。例如:
$ cat distro.listSlackwareFedoraRed Hat Enterprise LinuxUbuntuArch1337MintMageiaDebian$ sort distro.list1337ArchDebianFedoraMageiaMintRed Hat Enterprise LinuxSlackwareUbuntu
使用 sort
不会改变原文件。sort
仅起到过滤的作用,所以如果你希望按排序后的格式保存数据,你需要用 >
或 tee
进行重定向。
$ sort distro.list | tee distro.sorted1337ArchDebian[...]$ cat distro.sorted1337ArchDebian[...]
按列排序
复杂数据集有时候不止需要对每行的第一个字符进行排序。例如,假设有一个动物列表,每个都有其种和属,用可预见的分隔符分隔每一个"字段"(即数据表中的"单元格")。这类由数据表导出的格式很常见,CSV(以逗号分隔的数据comma-separated values)后缀可以标识这些文件(虽然 CSV 文件不一定用逗号分隔,有分隔符的文件也不一定用 CSV 后缀)。以下数据作为示例:
Aptenodytes;forsteri;Miller,JF;1778;EmperorPygoscelis;papua;Wagler;1832;GentooEudyptula;minor;Bonaparte;1867;Little BlueSpheniscus;demersus;Brisson;1760;AfricanMegadyptes;antipodes;Milne-Edwards;1880;Yellow-eyedEudyptes;chrysocome;Viellot;1816;Southern RockhopperTorvaldis;linux;Ewing,L;1996;Tux
对于这组示例数据,你可以用 --field-separator
(在 BSD 和 Mac 用 -t
,在 GNU 上也可以用简写 -t
)设置分隔符为分号(因为该示例数据中是用分号而不是逗号,理论上分隔符可以是任意字符),用 --key
(在 BSD 和 Mac 上用 -k
,在 GNU 上也可以用简写 -k
)选项指定哪个字段被排序。例如,对每行第二个字段进行排序(计数以 1 开头而不是 0):
sort --field-separator=";" --key=2Megadyptes;antipodes;Milne-Edwards;1880;Yellow-eyedEudyptes;chrysocome;Viellot;1816;Sothern RockhopperSpheniscus;demersus;Brisson;1760;AfricanAptenodytes;forsteri;Miller,JF;1778;EmperorTorvaldis;linux;Ewing,L;1996;TuxEudyptula;minor;Bonaparte;1867;Little BluePygoscelis;papua;Wagler;1832;Gentoo
结果有点不容易读,但是 Unix 以构造命令的管道方式而闻名,所以你可以使用 column
命令美化输出结果。使用 GNU column
:
$ sort --field-separator=";" \\--key=2 penguins.list | column --table --separator ";"Megadyptes antipodes Milne-Edwards 1880 Yellow-eyedEudyptes chrysocome Viellot 1816 Southern RockhopperSpheniscus demersus Brisson 1760 AfricanAptenodytes forsteri Miller,JF 1778 EmperorTorvaldis linux Ewing,L 1996 TuxEudyptula minor Bonaparte 1867 Little BluePygoscelis papua Wagler 1832 Gentoo
对于初学者可能有点不好理解(但是写起来简单),BSD 和 Mac 上的命令选项:
$ sort -t ";" \-k2 penguins.list | column -t -s ";"Megadyptes antipodes Milne-Edwards 1880 Yellow-eyedEudyptes chrysocome Viellot 1816 Southern RockhopperSpheniscus demersus Brisson 1760 AfricanAptenodytes forsteri Miller,JF 1778 EmperorTorvaldis linux Ewing,L 1996 TuxEudyptula minor Bonaparte 1867 Little BluePygoscelis papua Wagler 1832 Gentoo
当然 -k
不一定非要设为 2
。任意存在的字段都可以被设为排序的键。
逆序排列
你可以用 --reverse
(BSD/Mac 上用 -r
,GNU 上也可以用简写 -r
)选项来颠倒已经排好序的列表。
$ sort --reverse alphabet.listzyxw[...]
你也可以把输出结果通过管道传给命令 tac 来实现相同的效果。
按月排序(仅 GNU 支持)
理想情况下,所有人都按照 ISO 8601 标准来写日期:年、月、日。这是一种合乎逻辑的指定精确日期的方法,也可以很容易地被计算机理解。也有很多情况下,人类用其他的方式标注日期,包括用很名字随意的月份。
幸运的是,GNU sort
命令能识别这种写法,并可以按月份的名称正确排序。使用 --month-sort
(-M
)选项:
$ cat month.listNovemberOctoberSeptemberApril[...]$ sort --month-sort month.listJanuaryFebruaryMarchAprilMay[...]NovemberDecember
月份的全称和简写都可以被识别。
人类可读的数字排序(仅 GNU 支持)
另一个人类和计算机的常见混淆点是数字的组合。例如,人类通常把 "1024 kilobytes" 写成 "1KB",因为人类解析 "1 KB" 比 "1024" 要容易且更快(数字越大,这种差异越明显)。对于计算机来说,一个 9 KB 的字符串要比诸如 1 MB 的字符串大(尽管 9 KB 是 1 MB 很小一部分)。GNU sort
命令提供了--human-numeric-sort
(-h
)选项来帮助正确解析这些值。
$ cat sizes.list2M12MB1k9k9007000$ sort --human-numeric-sort90070001k9k2M12MB
有一些情况例外。例如,"16000 bytes" 比 "1 KB" 大,但是 sort
识别不了。
$ cat sizes0.list2M12MB160001k$ sort -h sizes0.list160001k2M12MB
逻辑上来说,这个示例中 16000 应该写成 16 KB,所以也不应该全部归咎于GNU sort
。只要你确保数字的一致性,--human-numeric-sort
可以用一种计算机友好的方式解析成人类可读的数字。
随机排序(仅 GNU 支持)
有时候工具也提供了一些与设计初衷相悖的选项。某种程度上说,sort
命令提供对一个文件进行随机排序的能力没有任何意义。这个命令的工作流让这个特性变得很方便。你可以用其他的命令,像 shuf ,或者你可以用现在的命令添加一个选项。不管你认为它是一个臃肿的还是极具创造力的用户体验设计,GNU sort
命令提供了对文件进行随机排序的功能。
最纯粹的随机排序格式选项是 --random-sort
或 -R
(不要跟 -r
混淆,-r
是 --reverse
的简写)。
$ sort --random-sort alphabet.listdmpa[...]
每次对文件运行随机排序都会有不同的结果。
感谢各位的阅读,以上就是"linux在命令行用sort进行排序"的内容了,经过本文的学习后,相信大家对linux在命令行用sort进行排序这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!