导读

在 Linux、BSD 或 Mac 的终端中使用 sort 命令,按自己的需求重新整理数据。

如果你曾经用过数据表应用程序,你就会知道可以按列的内容对行进行排序。例如,如果你有一个费用列表,你可能希望对它们进行按日期或价格升序抑或按类别进行排序。如果你熟悉终端的使用,你不会仅为了排序文本数据就去使用庞大的办公软件。这正是 sort 命令的用处。

安装

你不必安装 sort ,因为它向来都包含在 POSIX 系统里。在大多数 Linux 系统中,sort 命令来自 GNU 组织打包的实用工具集合中。在其他的 POSIX 系统中,像 BSD 和 Mac,默认的 sort 命令不是 GNU 提供的,所以有一些选项可能不一样。本文中我尽量对 GNU 和 BSD 两者的实现都进行说明。

按字母顺序排列行

sort 命令默认会读取文件每行的第一个字符并对每行按字母升序排序后输出。两行中的第一个字符相同的情况下,对下一个字符进行对比。例如:

$ cat distro.list

Slackware

Fedora

Red Hat Enterprise Linux

Ubuntu

Arch

1337

Mint

Mageia

Debian

$ sort distro.list

1337

Arch

Debian

Fedora

Mageia

Mint

Red Hat Enterprise Linux

Slackware

Ubuntu

使用 sort 不会改变原文件。sort 仅起到过滤的作用,所以如果你希望按排序后的格式保存数据,你需要用 > 或 tee 进行重定向。

$ sort distro.list | tee distro.sorted

1337

Arch

Debian

[...]

$ cat distro.sorted

1337

Arch

Debian

[...]

按列排序

复杂数据集有时候不止需要对每行的第一个字符进行排序。例如,假设有一个动物列表,每个都有其种和属,用可预见的分隔符分隔每一个“字段”(即数据表中的“单元格”)。这类由数据表导出的格式很常见,CSV(以逗号分隔的数据comma-separated values)后缀可以标识这些文件(虽然 CSV 文件不一定用逗号分隔,有分隔符的文件也不一定用 CSV 后缀)。以下数据作为示例:

Aptenodytes;forsteri;Miller,JF;1778;Emperor

Pygoscelis;papua;Wagler;1832;Gentoo

Eudyptula;minor;Bonaparte;1867;Little Blue

Spheniscus;demersus;Brisson;1760;African

Megadyptes;antipodes;Milne-Edwards;1880;Yellow-eyed

Eudyptes;chrysocome;Viellot;1816;Southern Rockhopper

Torvaldis;linux;Ewing,L;1996;Tux

对于这组示例数据,你可以用 --field-separator (在 BSD 和 Mac 用 -t,在 GNU 上也可以用简写 -t )设置分隔符为分号(因为该示例数据中是用分号而不是逗号,理论上分隔符可以是任意字符),用 --key(在 BSD 和 Mac 上用 -k,在 GNU 上也可以用简写 -k)选项指定哪个字段被排序。例如,对每行第二个字段进行排序(计数以 1 开头而不是 0):

sort --field-separator=";" --key=2

Megadyptes;antipodes;Milne-Edwards;1880;Yellow-eyed

Eudyptes;chrysocome;Viellot;1816;Sothern Rockhopper

Spheniscus;demersus;Brisson;1760;African

Aptenodytes;forsteri;Miller,JF;1778;Emperor

Torvaldis;linux;Ewing,L;1996;Tux

Eudyptula;minor;Bonaparte;1867;Little Blue

Pygoscelis;papua;Wagler;1832;Gentoo

结果有点不容易读,但是 Unix 以构造命令的管道方式而闻名,所以你可以使用 column 命令美化输出结果。使用 GNU column:

$ sort --field-separator=";" \

\--key=2 penguins.list | column --table --separator ";"

Megadyptes antipodes Milne-Edwards 1880 Yellow-eyed

Eudyptes chrysocome Viellot 1816 Southern Rockhopper

Spheniscus demersus Brisson 1760 African

Aptenodytes forsteri Miller,JF 1778 Emperor

Torvaldis linux Ewing,L 1996 Tux

Eudyptula minor Bonaparte 1867 Little Blue

Pygoscelis papua Wagler 1832 Gentoo

对于初学者可能有点不好理解(但是写起来简单),BSD 和 Mac 上的命令选项:

$ sort -t ";" \

-k2 penguins.list | column -t -s ";"

Megadyptes antipodes Milne-Edwards 1880 Yellow-eyed

Eudyptes chrysocome Viellot 1816 Southern Rockhopper

Spheniscus demersus Brisson 1760 African

Aptenodytes forsteri Miller,JF 1778 Emperor

Torvaldis linux Ewing,L 1996 Tux

Eudyptula minor Bonaparte 1867 Little Blue

Pygoscelis papua Wagler 1832 Gentoo

当然 -k 不一定非要设为 2。任意存在的字段都可以被设为排序的键。

逆序排列

你可以用 --reverse(BSD/Mac 上用 -r,GNU 上也可以用简写 -r)选项来颠倒已经排好序的列表。

$ sort --reverse alphabet.list

z

y

x

w

[...]

你也可以把输出结果通过管道传给命令 tac 来实现相同的效果。

按月排序(仅 GNU 支持)

理想情况下,所有人都按照 ISO 8601 标准来写日期:年、月、日。这是一种合乎逻辑的指定精确日期的方法,也可以很容易地被计算机理解。也有很多情况下,人类用其他的方式标注日期,包括用很名字随意的月份。

幸运的是,GNU sort 命令能识别这种写法,并可以按月份的名称正确排序。使用 --month-sort(-M)选项:

$ cat month.list

November

October

September

April

[...]

$ sort --month-sort month.list

January

February

March

April

May

[...]

November

December

月份的全称和简写都可以被识别。

人类可读的数字排序(仅 GNU 支持)

另一个人类和计算机的常见混淆点是数字的组合。例如,人类通常把 “1024 kilobytes” 写成 “1KB”,因为人类解析 “1 KB” 比 “1024” 要容易且更快(数字越大,这种差异越明显)。对于计算机来说,一个 9 KB 的字符串要比诸如 1 MB 的字符串大(尽管 9 KB 是 1 MB 很小一部分)。GNU sort 命令提供了--human-numeric-sort(-h)选项来帮助正确解析这些值。

$ cat sizes.list

2M

12MB

1k

9k

900

7000

$ sort --human-numeric-sort

900

7000

1k

9k

2M

12MB

有一些情况例外。例如,“16000 bytes” 比 “1 KB” 大,但是 sort 识别不了。

$ cat sizes0.list

2M

12MB

16000

1k

$ sort -h sizes0.list

16000

1k

2M

12MB

逻辑上来说,这个示例中 16000 应该写成 16 KB,所以也不应该全部归咎于GNU sort。只要你确保数字的一致性,--human-numeric-sort 可以用一种计算机友好的方式解析成人类可读的数字。

随机排序(仅 GNU 支持)

有时候工具也提供了一些与设计初衷相悖的选项。某种程度上说,sort 命令提供对一个文件进行随机排序的能力没有任何意义。这个命令的工作流让这个特性变得很方便。你可以用其他的命令,像 shuf ,或者你可以用现在的命令添加一个选项。不管你认为它是一个臃肿的还是极具创造力的用户体验设计,GNU sort 命令提供了对文件进行随机排序的功能。

最纯粹的随机排序格式选项是 --random-sort 或 -R(不要跟 -r 混淆,-r 是 --reverse 的简写)。

$ sort --random-sort alphabet.list

d

m

p

a

[...]

每次对文件运行随机排序都会有不同的结果。

结语

GNU 和 BSD 的 sort 命令还有很多功能,所以花点时间去了解这些选项。你会惊异于 sort 的灵活性,尤其是当它和其他的 Unix 工具一起使用时。

linux命令 排序,linux之sort排序相关推荐

  1. linux cp命令 前面,盘点Linux命令之Linux cp命令使用大全

    Linux命令有很多,其中Linux cp命令常用的一种,Linux cp命令如何使用,下面IT培训网将为您盘点有关Linux命令之Linux cp命令大全. Linux命令之Linux cp命令详解 ...

  2. linux命令 bind,Linux bind命令

    # Linux bind命令 [![Linux 命令大全](/images/1590082124592.gif "Linux 命令大全") Linux 命令大全](/queryGr ...

  3. Linux命令篇 linux命令大全简洁明了 linux学习笔记

    Linux命令篇 linux命令大全简洁明了 linux学习笔记 Linux 命令大全 文章目录 Linux 命令大全 一. 常用的基础命令 查看目录: 切换目录: 创建和删除: 拷贝和移动文件: 查 ...

  4. linux命令怎么查看文件时间排序,linux中ls命令按照文件大小排...-ls命令按大小与时间排序文件...-ls按时间排序输出文件列表的实例分析_169IT.COM...

    ls命令可以按照文件大小进行输出排序. 代码示例: man ls -S sort  by file size 用法: ls -Sl 这是按照由大到小排序,如果想要反过来,从小到大,那么用: ls -S ...

  5. Linux 命令(6)—— sort 命令

    1.命令简介 以行为单位对文本文件的内容进行排序,将结果显示在标准输出,比较原则是从行首字符向后,依次按 ASCII 码值进行比较,最后按升序输出.如果 file 参数指定多个文件,那么 sort 命 ...

  6. linux du sort命令,linux命令:du、sort、more、cat、less

    一个比较经典的问题: 如果线上机器的磁盘占用率超级高,怎么办? 这时候优先想到的肯定是,定位到占用磁盘空间最大的那些文件,然后把可以删的给删掉. 那么,问题来了,如何定位到占用磁盘空间最大的文件? 一 ...

  7. sed是linux命令吗,Linux命令 sed

    一. 以行为单位进行操作. d:删除 $ nl passwd | sed '2,5d'  # 删除第2~5行 $ nl passwd | sed '2d'  # 删除第2行 $ nl passwd | ...

  8. linux命令eric,linux命令杂记 - erichd的个人页面 - OSCHINA - 中文开源技术交流社区

    查找最近24小时内修改过的文件 find / -type f -mtime 0 将nginx日志输出成html报表 goaccess -f access.log-20151201 -a > /r ...

  9. linux命令和Linux基本常用的知识详解

    Linux简介与厂商版本 1. Linux简介 Linux可以有狭义和广义两种定义.狭义来说,Linux实际上指Linux kernel (内核).内核负责管理硬件,并为上层应用提供接口.而广义来说, ...

  10. linux命令th,Linux 第13天 文本操作命令

    Linux 第13天 时间: 20180730 文本操作命令学习 /dev/urandom 一个生成随机字符的设备 cat  /dev/urandom |tr  -dc '[:alnum:][:pri ...

最新文章

  1. NC:潮湿的墙体和家具中微生物迅速增长!
  2. CSS实现自适应浏览器宽度的正方形
  3. pyqt webview 执行js
  4. 构建多域名Exchange 2010邮件系统
  5. 【数据结构-排序】1. 图解插入排序三种实现(插入排序/折半排序/希尔排序)
  6. 20 款优秀的数据可视化工具,总有一款你用的到!
  7. [8086汇编]利用栈翻转内存数据
  8. php heredoc 用法
  9. Hibernate组件作为Map索引(四)
  10. PHP面向对象学习(一)
  11. python刷课系统教师_让教师只想刷课的继续教育不能继续了
  12. ROS操作系统入门学习
  13. 珍爱网App竞品分析报告
  14. iOS-OC-集成PayPal支付方式
  15. 《精通CSS》读书笔记2
  16. vue js 前端实现PDF文件下载的三种方式 解决vue下载pdf文件打开文件后空白
  17. 单词快速记忆day 1
  18. 找回你的xournal++未保存文档
  19. Kindeditor的简单使用以及图片上传
  20. PXE+KickStart自动化安装Linux系统

热门文章

  1. 关于java中用jxl从ex表格读取数据转存到数据库里
  2. 2021年安全员-A证模拟试题及安全员-A证实操考试视频
  3. 库克喜提 8 个亿年终奖
  4. python绘五环,还不过来Look一下吗
  5. 非对称加密 ECC算法
  6. HTML下划线用虚线表示
  7. 司徒正美写给前端开发者的算法书
  8. L0、L1、L2范数
  9. sass揭秘之@if,@for,@each
  10. javascript实现卡片式效果