
文章插图
在 linux、BSD 或 mac 的终端中使用 sort 命令,按自己的需求重新整理数据 。-- Seth Kenlon(作者)
如果你曾经用过数据表应用程序,你就会知道可以按列的内容对行进行排序 。例如,如果你有一个费用列表,你可能希望对它们进行按日期或价格升序抑或按类别进行排序 。如果你熟悉终端的使用,你不会仅为了排序文本数据就去使用庞大的办公软件 。这正是 sort 命令的用处 。
安装你不必安装 sort ,因为它向来都包含在 POSIX 系统里 。在大多数 Linux 系统中,sort 命令来自 GNU 组织打包的实用工具集合中 。在其他的 POSIX 系统中,像 BSD 和 Mac,默认的 sort 命令不是 GNU 提供的,所以有一些选项可能不一样 。本文中我尽量对 GNU 和 BSD 两者的实现都进行说明 。
按字母顺序排列行【在命令行用 sort 进行排序】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 标准来写日期:年、月、日 。这是一种合乎逻辑的指定精确日期的方法,也可以很容易地被计算机理解 。也有很多情况下,人类用其他的方式标注日期,包括用很名字随意的月份 。
推荐阅读
- 人类对茶利用的发展趋势
- 洗茶的原因和由来浅说
- Linux的图形用户界面-你会选择哪个?
- 苏轼出生在什么朝代 苏轼与欧阳修并称是什么之一
- 梦见老同事和老领导 梦见老同事在一起聊天
- 招聘|大学毕业才知道,比英语四六级有用的证书是这些,聪明学生早考了
- 空调消毒怎么操作,用什么给空调过滤网消毒
- 天然真石漆能不能用于室内,天然真石漆怎么使用
- 企业入驻天猫网店需要哪些条件 天猫专卖店入驻条件费用
- 都匀品茗,诗意遗落在粼粼的剑江河中
