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

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

对于 Unix 排序有什么好办法吗?使用一个键就像使用’-n’一样简单。我已经阅读了手册页,并简要地搜索了谷歌,但没有找到一个好的例子。我该怎么做呢?

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

148797 次浏览

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

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。

我相信在你的情况下

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

会更有效。@ 是字段分隔符,确保它是一个不会出现的字符。那么您的输入被认为是由一列组成的。

编辑: 显然 clintp 已经给出了类似的答案,对不起。正如他指出的,标志‘ n’和‘ r’可以添加到 every-k... 选项中。

但要小心:

如果你想按字段3对文件进行排序,然后按字段2对文件进行排序,你需要这样做:

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

不是这个: sort -k 3 -k 2 < inputfile,它按字符串从字段3的开始到行的结束对文件进行排序(这可能是唯一的)。

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

请注意,也可能是希望稳定的排序与 -s开关,以便同等排名的线保持其原来的相对顺序在输出太多。

我只是想添加一些提示,在使用 sort 时,要注意影响键比较顺序的区域设置。我通常显式地使用 LC _ ALL = C 来创建我想要的语言环境。

下面是一个按数字和字典顺序对 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,1 n 表示从列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