我有可能需要按1-n键排序的大文件.其中一些键可能是数字键,其中一些可能不是.这是一个固定宽度的柱状文件,因此没有分隔符.
使用Unix排序有一个很好的方法吗?使用一个键就像使用'-n'一样简单.我已阅读该手册页并简要搜索了Google,但没有找到一个好的例子.我将如何实现这一目标?
注意:由于文件大小的可能性,我已经排除了Perl.这将是最后的手段.
请注意:
如果要主要按字段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)
-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
按月编号(位置4-5)对目录列表进行数字排序,然后按文件名(位置40-60)反向排序.由于没有标签,因此所有字段1都要排序.
使用-k
选项(或--key=POS1[,POS2]
).它可以出现多次,每个键都可以有全局选项(例如n
用于数字排序)
这里是一个用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
我相信你的情况就像
sort -t@ -k1.1,1.4 -k1.5,1.7 ...会更好.@是字段分隔符,确保它是一个无处出现的字符.然后您的输入被视为由一列组成.
编辑:显然clintp已经给出了类似的答案,抱歉.正如他所指出的,标志'n'和'r'可以添加到每个-k ....选项中.
6> ron..:注意,也可能需要使用
-s
开关来稳定排序,以便同等排序的线也在输出中保持其原始相对顺序.