我在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。它发生在不同的位置,因为它是一个很大的列表。有人知道如何解决这个问题吗? 先谢谢
答案 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>