sort排序命令多列排序_在命令行进行排序排序

sort排序命令多列排序

如果您曾经使用过电子表格应用程序,那么您知道行可以按列的内容排序。 例如,如果您有费用清单,则可能要按日期,升序或类别等对它们进行排序。 如果您习惯使用终端,则可能不希望仅使用大型Office应用程序对文本数据进行排序。 这正是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不会更改原始文件。 排序是一个过滤器,因此,如果要以排序形式保留数据,则必须使用>tee重定向输出:


   
   
$ sort distro.list | tee distro.sorted
1337
Arch
Debian
[...]
$ cat distro.sorted
1337
Arch
Debian
[...]

按栏排序

有时,复杂数据集需要按每行的首字母以外的其他内容进行排序。 例如,想象一下一个动物列表,以及每个动物的物种和属,每个“字段”(电子表格中的“单元”)都由可预测的分隔符定义。 这是电子表格导出的一种通用数据格式,以CSV(逗号分隔值)文件扩展名可以识别此类文件(尽管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


   
   
$ 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

当然, 定义不必设置为2 。 任何现有字段都可以用作排序关键字。

反向排序

您可以使用--reverse (为简明起见,在BSD或Mac或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 KB”写为“ 1KB”,因为人脑解析“ 1KB”比“ 1024”更容易,更快捷(数字越大,变得越容易)。 但是,对于计算机而言,诸如9KB之类的字符串要大于例如1MB(即使9KB只是兆字节的一部分)。 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

有一些不一致之处。 例如,16,000字节大于1KB,但是排序无法识别:


   
   
$ cat sizes0.list
2M
12MB
16000
1k
$ sort -h sizes0.list
16000
1k
2M
12MB

从逻辑上讲,在这种情况下应将16,000写为16KB,因此不应该完全归咎于GNU 排序 。 只要您确定自己的数字是一致的,-- human-numeric-sort可以以计算机友好的方式帮助解析人类可读的数字。

随机排序(仅限GNU)

有时,实用程序提供了相反的选择。 从某种意义上说, 排序命令具有随机对文件进行“排序”的能力是没有意义的。 再者,命令的工作流程使其成为一种方便的功能。 您可以使用其他命令,例如shuf ,也可以在正在使用的命令中添加一个选项。 无论是过时的设计还是巧妙的UX设计,GNU sort命令都提供了对文件进行任意排序的方法。

任意排序的最纯粹形式是--random-sort-R选项(不要与-r选项混淆,后者是--reverse的缩写 )。


   
   
$ sort --random-sort alphabet.list
d
m
p
a
[...]

您可以对文件多次运行随机排序,以每次获得不同的结果。

已排序

GNU和BSD 排序命令还有许多其他功能,因此花一些时间来了解这些选项。 您会惊讶于排序的灵活性,特别是当它与其他Unix实用程序结合使用时。

翻译自: https://opensource.com/article/19/10/get-sorted-sort

sort排序命令多列排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值