我有可能需要按1-n键排序的大文件。其中一些键可能是数字,其中一些键可能不是。这是一个固定宽度的列式文件,因此没有分隔符。使用Unix排序排序多个键
有没有一种很好的方法来做到这一点与Unix排序?使用一个键就像使用'-n'一样简单。我已阅读手册页并简要搜索了Google,但没有找到一个好例子。我将如何去完成这件事?
注意:由于文件大小的潜力,我排除了Perl。这将是最后的手段。
我有可能需要按1-n键排序的大文件。其中一些键可能是数字,其中一些键可能不是。这是一个固定宽度的列式文件,因此没有分隔符。使用Unix排序排序多个键
有没有一种很好的方法来做到这一点与Unix排序?使用一个键就像使用'-n'一样简单。我已阅读手册页并简要搜索了Google,但没有找到一个好例子。我将如何去完成这件事?
注意:由于文件大小的潜力,我排除了Perl。这将是最后的手段。
使用-k
选项(或--key=POS1[,POS2]
)。它可以出现多次,每个键可以有全局选项(如n
用于数字排序)
从排序手册页:“POS是F [.C] [OPTS],其中F是字段编号,C是字段中的字符位置;都是原点1.”请参阅手册页获取完整文档。 – 2008-12-10 20:59:50
另请参阅andras的答案,如果你不想疯了。 – ron 2011-08-30 08:54:25
上面的两条评论都是准确的和附加的。谢谢,先生们。 – 2012-12-11 04:26:34
-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)反向。由于没有标签,因此所有字段都需要排序。
如果输入数据中没有空格,则只有一个字段。尽管如此,你的例子很有用。 – 2008-12-11 06:05:02
我相信,在你的情况类似
sort [email protected] -k1.1,1.4 -k1.5,1.7 ... <inputfile
会更好地工作。 @是字段分隔符,确保它是一个无处可见的字符。那么你的输入被认为是由一列组成的。
编辑:显然clintp已经给出了类似的答案,对不起。正如他指出的那样,可以将标志'n'和'r'添加到每个-k ....选项。
请务必小心,虽然:
如果你想主要由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)
注意,也可能期望稳定的排序与-s
开关,从而使同样排名线路中的输出保持原有相对顺序太。
我只是想添加一些提示,当你使用排序时,要小心你的语言环境,影响键比较的顺序。我通常明确使用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,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
一个或两个示例的数据线将是很有益用于创建例如命令行。此外,“1-n”键是否意味着您需要通过可变数量的键进行排序?这样做没有脚本会很有趣... – 2008-12-10 20:58:55
我有一个PHP包装器绕sort命令启用1-n功能。 – 2008-12-10 21:28:29