用Unixsorting多个键

我有可能需要按1-n键sorting的大文件。 其中一些键可能是数字,其中一些键可能不是。 这是一个固定宽度的柱状文件,所以没有分隔符。

有没有一种很好的方式与Unixsorting? 用一个键就像使用'-n'一样简单。 我已经阅读了手册页,并简要地search了Google,但没有find一个好的例子。 我将如何去完成这个?

注意:由于文件大小的潜力,我排除了Perl。 这将是最后的手段。

使用-k选项(或--key=POS1[,POS2] )。 它可以出现多次,每个键可以有全局选项(如n为数字sorting)

请注意,

如果你想sorting文件主要由字段3,其次是字段2,你不想这样:

 sort -k 3 -k 2 < inputfile 

你需要这个:

 sort -k 3,3 -k 2,2 < inputfile 

第一个按从字段3开始到行结束(可能是唯一的)的stringsorting文件。

 -k, --key=POS1[,POS2] start a key at POS1 (origin 1), end it at POS2 (default end of line) 

-k选项就是你想要的。

 -k 1.4,1.5n -k 1.14,1.15n 

将在第一个字段中使用字符位置4-5(它是固定宽度的全部字段),并按第一个键的数字sorting。

第二个关键字也是第一个字段中的字符14-15。

(编辑)

例子(我所有的是DOS / cygwin方便):

 dir | \cygwin\bin\sort.exe -k 1.4,1.5n -k 1.40,1.60r 

对于数据:

 12/10/2008 01:10 PM 1,564,990 outfile.txt 

按照月份编号(位置4-5)按数字sorting目录列表​​,然后按文件名(位置40-60)反向排列。 由于没有选项卡,所有字段1都要进行sorting。

这里是按csv文件中数字和字典顺序,第5列和后面的字典顺序对各列进行sorting

 ~/test>sort -t, -k1,1n -k2,2n -k3,3d -k4,4n -k5d sort.csv 1,10,b,22,Ga 2,2,b,20,F 2,2,b,22,Ga 2,2,c,19,Ga 2,2,c,19,Gb,hi 2,2,c,19,Gb,hj 2,3,a,9,C ~/test>cat sort.csv 2,3,a,9,C 2,2,b,20,F 2,2,c,19,Gb,hj 2,2,c,19,Gb,hi 2,2,c,19,Ga 2,2,b,22,Ga 1,10,b,22,Ga 

注意-k1,1n表示从第1列开始到第1列结束的数字。如果我在下面做了,它将连接列1和2,使得1,10sorting为110

 ~/test>sort -t, -k1,2n -k3,3 -k4,4n -k5d sort.csv 2,2,b,20,F 2,2,b,22,Ga 2,2,c,19,Ga 2,2,c,19,Gb,hi 2,2,c,19,Gb,hj 2,3,a,9,C 1,10,b,22,Ga 

我相信你的情况是这样的

 sort -t@ -k1.1,1.4 -k1.5,1.7 ... <inputfile 

会更好地工作。 @是字段分隔符,确保它是一个无处可见的字符。 那么你的input被认为是由一列组成。

编辑:显然clintp已经给了一个类似的答案,对不起。 正如他指出的那样,可以将标记“n”和“r”添加到每个-k …选项。

请注意,也可能需要使用-s开关来稳定sorting,以便排名相同的行也保持其在输出中的原始相对顺序。

我只是想添加一些提示,当你使用sorting,要小心你的语言环境,影响键比较的顺序。 我通常明确地使用LC_ALL = C来创build我想要的语言环境。