sort -n 命令如何知道在包含数字和文本的文件中需要排序的内容?

sort -n 命令如何知道在包含数字和文本的文件中需要排序的内容?

我现在正在读这个博客:https://www.baeldung.com/linux/dir-find-largest-file-recursively

我正在询问这个命令:

find /usr/lib -type f -printf "%s\t%p\n" | sort -n | tail -1
92107656        /usr/lib/x86_64-linux-gnu/libwireshark.so.13.0.3

%s打印尺寸并%p打印路径。但如何sort -n知道它需要按大小而不是路径排序呢?

我知道这可能是个愚蠢的问题,但无论如何我还是问了。

根据文档,https://man7.org/linux/man-pages/man1/sort.1.html

-n, --numeric-sort
compare according to string numerical value

这使用字符串数值进行排序。它如何知道需要专门查看第一列?

答案1

许多选项会影响sort线的比较方式

info coreutils sort invocation解释了如何sort工作:

一对行的比较如下:根据关联的排序选项,按照命令行上指定的顺序sort比较每对字段(请参阅--key),直到发现差异或不留下任何字段。如果未指定键字段,则sort 使用整行的默认键

因此,sort -n将以数字方式对输入进行排序(如下文进一步解释),比较整行,因为没有指定关键字段:

-n
--numeric-sort
--sort=numeric

按数字排序。每行开始的数字并由可选的空格、可选的-符号和可能由千位分隔符分隔的零个或多个数字组成,可选地后跟一个小数点字符和零个或多个数字。空数被视为0。区域LC_NUMERIC设置指定小数点字符和千位分隔符。默认情况下,空白是空格或制表符,但LC_CTYPE区域设置可以更改这一点。

比较准确;没有舍入误差。

答案2

因为无论如何,这就是 sort 的作用。它对线路进行排序。排序总是通过比较两个字符串的开头(在每种情况下,不仅仅是命令sort;与您在纸上排序单词进行检查)进行排序,并且仅当开头相等时,向前移动一个元素并进行比较,依此类推。

-n模式下,sort只需读取每行开头的字符,只要它们形成数字,然后将该数字解释为第一个元素。然后,第二个元素成为可解释为数字之后的第一个字符,第三个元素是可解释为数字之后的第二个字符,依此类推)。

在任何模式中,sort除了对事物进行排序之外,都不做任何事情,因此,它总是首先比较第一个元素,并且永远不会出现“为什么它不按稍后出现的行的某些部分进行排序”的问题。

sort因此, (不使用其 标志)中没有任何内容-k将您的数据视为在列中。它对字符串进行排序,但有一个特殊的例外,即-n它尝试将这些字符串开头的所有字符解释为一个数字作为单个“超级字符”。

答案3

没有这个概念,但是有一个概念领域,有一个--field-separator选项。

然后,每个字段都可以有一个单独的--key=KEYDEF.行可以按多个键字段排序(可以按行中的任何顺序出现),并且任何键定义都可以独立指定忽略空格、数字键以及升序或降序。有十一个这样的子选项可用于任何关键规范。

man sort页面完全不够。至少参考一下info sort

您还可以阅读https://www.gnu.org/software/coreutils/manual/coreutils.pdf 向下滚动到Section 7.1 sort: Sort text files十页详细信息,包括以下内容:

sort -t : -b -k 5,5 -k 3,3n /etc/passwd

本节还引用了 DSU 习惯用法(Decorate、Sort、Undecorate),这是完全灵活的。

相关内容