在Linux中排序问题

时间:2015-12-23 15:04:37

标签: linux sorting

我在linux中有这样的文件列表:

440c0402 mfcc.2.ark:15681
440c0401 mfcc.1.ark:501177
440c0401 mfcc.1.ark:9
440c0403 mfcc.3.ark:516849

当我尝试在Linux中使用sort命令对它们进行排序时,我得到:

440c0401 mfcc.1.ark:501177
440c0401 mfcc.1.ark:9
440c0402 mfcc.2.ark:15681
440c0403 mfcc.3.ark:516849

第一行和第二行应该是反向的,因为501177> 9。它发生在不同的位置,因为它是一个很大的列表。有人知道如何解决这个问题吗? 先谢谢

5 个答案:

答案 0 :(得分:3)

更简单的版本

$ sort -t: -k1,1 -k2n file

440c0401 mfcc.1.ark:9
440c0401 mfcc.1.ark:501177
440c0402 mfcc.2.ark:15681
440c0403 mfcc.3.ark:516849

对于固定长度字段,数字或词法排序的行为相同,对于可变长度数字,它是不同的(没有前导零!!)。

这会将行分为两个“:”,第一部分是固定长度,所以不需要特别小心,但是对于第二部分,你必须添加n后缀来表示数字排序。

答案 1 :(得分:2)

文件名是字符串类型数据;不是数字。

因此,当您对它们进行排序时,字符会从第一个字符位置开始进行比较。

因此,在文件 501177 中, 5 9 进行比较。

但你所想的是数值。

如果你想在数字上对它们进行比较,你需要提取出来的部分,将它(根据你的编程语言)进行比较并进行比较。

哦,顺便说一下,这不是特定于Linux的问题。相反,它是计算机默认处理字符串的方式。

答案 2 :(得分:2)

这对我有用:

$ sort -n -t: -k2 inputfile
440c0401 mfcc.1.ark:9
440c0402 mfcc.2.ark:15681
440c0401 mfcc.1.ark:501177
440c0403 mfcc.3.ark:516849

我正在使用的选项是:

  • -n按数字排序,
  • -t:设置:
  • 的字段分隔符
  • -k2告诉sort考虑每行的第二个字段。

毋庸置疑(但无论如何我会这么说),这取决于你的样本数据格式后面的行。

我在FreeBSD中这样做,但我相信我使用的排序选项可以移植到Linux。

答案 3 :(得分:1)

这是你想要使用的:

sort -t: -k 1.5,1.8n -k 2.1,2.7n inputfile 440c0401 mfcc.1.ark:9 440c0401 mfcc.1.ark:501177 440c0402 mfcc.2.ark:15681 440c0403 mfcc.3.ark:516849

-t-fields of fields(不应在inputfile的其他地方使用

-k是排序的关键(可以使用> 1) -k 1.5,1.8n表示:按字段1从第5个字符到第8个字符对数字(这告诉n)进行排序。

-k告诉第2个字符从第1个字符到第7个字符排序。

答案 4 :(得分:0)

谢谢大家。我试过这个并为我工作:

sort -t ':' -k1,1 -k 2n,2 <filename>