我有可能需要按1-n键排序的大文件。其中一些键可能是数字键,其中一些可能不是。这是一个固定宽度的柱状文件,因此没有分隔符。
使用Unix排序是否有一个好方法?使用一个键就像使用'-n'一样简单。我已阅读该手册页并简要搜索了Google,但没有找到一个好的例子。我将如何完成这项工作?
注意:由于文件大小的可能性,我已经排除了Perl。这将是最后的手段。
答案 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来制作我想要的语言环境。