当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用Unix排序对多个键进行排序》经验,为你挑选了6个好方法。

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

使用Unix排序有一个很好的方法吗?使用一个键就像使用'-n'一样简单.我已阅读该手册页并简要搜索了Google,但没有找到一个好的例子.我将如何实现这一目标?

注意:由于文件大小的可能性,我已经排除了Perl.这将是最后的手段.



1> andras..:

请注意:

如果要主要按字段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)


改变生活.谢谢.
哎呦!现在我必须修复一个脚本,因为早些时候我只看到了上面的第一个答案...好东西我还没有依赖脚本输出....

2> Clinton Pier..:

-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都要排序.



3> Ken Gentle..:

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


如果你不想疯狂,也可以看看andras的答案.
从排序手册页:"POS是F [.C] [OPTS],其中F是字段编号,C是字段中的字符位置;两者都是原点1." 有关完整文档,请参见手册页.

4> edW..:

这里是一个用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



5> Dong Hoon..:

我相信你的情况就像

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

会更好.@是字段分隔符,确保它是一个无处出现的字符.然后您的输入被视为由一列组成.

编辑:显然clintp已经给出了类似的答案,抱歉.正如他所指出的,标志'n'和'r'可以添加到每个-k ....选项中.



6> ron..:

注意,也可能需要使用-s开关来稳定排序,以便同等排序的线也在输出中保持其原始相对顺序.

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有