使用sort命令重组数据,可以从Linux,BSD或Mac终端以对你有意义的格式进行。
如果你曾经使用过电子表格应用程序,那么你就会知道行可以按列的内容排序。 例如,如果有一个支出清单,你可能想要按日期,价格升序或类别等因素对它们进行排序。 如果习惯使用终端,你可能不希望仅为了进行文本数据排序就启用大型office应用程序。 这时正好让sort命令发挥作用。
你不需要安装sort,因为它包含在任意POSIX系统内。 在大多数Linux系统上,sort命令捆绑在GNU组织的一组实用程序中。 在其他POSIX系统(例如BSD和Mac)上,默认的sort命令不是来自GNU的,因此某些选项可能有所不同。 在本文中,我将尝试说明GNU和BSD的实现。
在默认情况下,sort命令查看文件每一行的第一个字符,并以字母升序输出每一行。 如果多行中的两个字符相同,则会考虑下一个字符。 例如:
使用sort不会更改原始文件。 排序是一个过滤器,因此,如果要以排序形式保留数据,则必须使用“>”或“tee”重定向输出:
有时,复杂数据集需要按除每行首字母之外的其他内容排序。 例如,想象一下一个动物列表,以及每个动物的物种和属,每个“字段”(电子表格中的“单元”)都由可预测的分隔符定义。 这是电子表格导出的一种通用数据格式,CSV(逗号分隔值)文件扩展名可以识别此类文件(尽管CSV文件不必以逗号分隔,分隔文件也不必使用 CSV扩展名以确保有效且可用)。 考虑以下示例数据集:
根据此示例数据集,您可以使用“--field-separator”选项(在BSD和Mac上使用“-t”,或者在GNU上减少键入),选项将分隔字符设置为分号(该示例使用分号而不是逗号, 但可以使用任何字符),并使用“--key”(在BSD和Mac上为“-k”,或者在GNU上减少键入)选项定义要作为排序依据的字段。 例如,要按每行的第二个字段(从1开始,而不是0)排序:
这有点难以理解,但是Unix以其构造命令的管道方法而闻名,因此你可以使用column命令来“整理”输出。 使用GNU列:
BSD和Mac上的命令选项对新用户来说有点晦涩难懂(但类型更短):
当然,key定义不必设置为2。 任何现有字段都可以用作排序关键字。
你可以使用“--reverse”(为简明起见,可在BSD或Mac或GNU上写为“-r”)来反转排序列表的顺序:
通过tac进行常规排序输出传递,你可以得到相同的结果。
在理想的情况下,每个人都会根据ISO 8601标准写日期:年,月,日。 这是指定唯一日期的逻辑方法,计算机很容易理解。 但是,人们经常使用其他方式来识别日期,包括命名不太规律的月份。
幸运的是,GNU sort命令解决了这个问题,并且能够按月份名称正确排序。 使用“--month-sort(-M)”选项:
月份可以通过其全名或名称的某些部分来标识。
人与计算机之间另一个常见的混淆点是数字组。 例如,人类经常将“ 1024 KB”写为“ 1KB”,因为与“ 1024”相比,解析“ 1KB”比“ 1024”更容易和快捷(并且数字越大,变得越容易)。 但是,对于计算机而言,诸如9KB之类的字符串大于1MB(即使9KB只是兆字节的一部分)。 GNU sort命令提供了“--human-numeric-sort(-h)”选项,以帮助正确解析这些值。
有一些矛盾之处。 例如,16,000字节大于1KB,但是排序无法识别:
从逻辑上讲,在这种情况下应将16,000写为16KB,因此不应该完全责怪GNU sort。 只要确定自己的数字是一致的,“--human-numeric-sort”可以以计算机友好的方式帮助解析人类可读的数字。
有时,实用程序提供了执行相反操作的选项。 从某种意义上说,排序命令的随机“排序”文件能力是没有意义的。 再者,命令的工作流程使其成为一种方便的功能。 你可以使用其他命令(例如shuf),也可以在正在使用的命令中添加一个选项。 无论是过时的设计还是巧妙的UX设计,GNU sort命令都提供了对文件进行任意排序的方法。
任意排序的最纯粹形式是“--random-sort”或“-R”选项(不要与“-r”选项混淆,后者是“--reverse”的缩写)。
你可以对文件多次运行随机排序,以便每次获得不同的结果。
sort GNU和BSD排序命令还有许多其他功能,因此可以花一些时间来了解这些选项。 你会惊讶于排序的灵活性,特别是当它与其他Unix实用程序结合使用时。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。