2008-12-10 65 views
113

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

有没有一种很好的方法来做到这一点与Unix排序?使用一个键就像使用'-n'一样简单。我已阅读手册页并简要搜索了Google,但没有找到一个好例子。我将如何去完成这件事?

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

+0

一个或两个示例的数据线将是很有益用于创建例如命令行。此外,“1-n”键是否意味着您需要通过可变数量的键进行排序?这样做没有脚本会很有趣... – 2008-12-10 20:58:55

+0

我有一个PHP包装器绕sort命令启用1-n功能。 – 2008-12-10 21:28:29

回答

56

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

+6

从排序手册页:“POS是F [.C] [OPTS],其中F是字段编号,C是字段中的字符位置;都是原点1.”请参阅手册页获取完整文档。 – 2008-12-10 20:59:50

+37

另请参阅andras的答案,如果你不想疯了。 – ron 2011-08-30 08:54:25

+1

上面的两条评论都是准确的和附加的。谢谢,先生们。 – 2012-12-11 04:26:34

85

-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),然后按文件名(位置40-60)反向。由于没有标签,因此所有字段都需要排序。

+0

如果输入数据中没有空格,则只有一个字段。尽管如此,你的例子很有用。 – 2008-12-11 06:05:02

10

我相信,在你的情况类似

sort [email protected] -k1.1,1.4 -k1.5,1.7 ... <inputfile 

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

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

262

请务必小心,虽然:

如果你想主要由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) 
5

注意,也可能期望稳定的排序与-s开关,从而使同样排名线路中的输出保持原有相对顺序太。

2

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

16

这里是一个由数字和字典以便在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