使用Unix排序对多个键进行排序

时间:2008-12-10 20:48:39

标签: linux unix sorting

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

使用Unix排序是否有一个好方法?使用一个键就像使用'-n'一样简单。我已阅读该手册页并简要搜索了Google,但没有找到一个好的例子。我将如何完成这项工作?

注意:由于文件大小的可能性,我已经排除了Perl。这将是最后的手段。

7 个答案:

答案 0 :(得分:292)

请注意:

如果要主要按字段3排序文件,其次按字段2排序,则不需要:

sort -k 3 -k 2 < inputfile

你想要这个:

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

第一个按字符串从字段3的开头到行尾(可能是唯一的)对文件进行排序。

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

答案 1 :(得分:91)

-k选项就是你想要的。

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

在第一个字段中使用字符位置4-5(它是固定宽度的所有字段)并在数字上排序为第一个键。

第二个键也是第一个字段中的字符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

按月份编号(pos 4-5)对目录列表进行数字排序,然后按文件名(pos 40-60)进行反向排序。由于没有标签,因此所有字段1都要排序。

答案 2 :(得分:66)

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

答案 3 :(得分:21)

这是一个按数字和字典顺序排序csv文件中的各列,第5列和后面的字典顺序

~/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,10排序为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

答案 4 :(得分:11)

我相信你的情况就像

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

会更好。 @是字段分隔符,确保它是一个无处出现的字符。然后您的输入被视为由一列组成。

编辑:显然clintp已经给出了类似的答案,抱歉。正如他所指出的,标志'n'和'r'可以添加到每个-k ....选项。

答案 5 :(得分:5)

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

答案 6 :(得分:2)

我只想添加一些提示,当您使用sort时,请注意影响键比较顺序的语言环境。我通常明确使用LC_ALL = C来制作我想要的语言环境。