用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我想要的语言环境。