- 论坛徽章:
- 2
|
本帖最后由 yinyuemi 于 2011-01-18 13:36 编辑
回复 1# ttxy624
不知lz的问题是否解决,下面是我的一些理解,
经过一些数据的测试,得出以下一些结论,欢迎大家给予指正:
lz的问题主要是sort 排序的时候,使用-n 和不使用 -n 对参数-k 排序结果有没有影响,答案应该是肯定的。
首先我们大概了解下,sort 对数据和字符在使用-n和不使用-n排序的区别:
- # 未使用-n
- echo "1
- 10
- 2
- a
- b
- 0a" |sort
- 0a
- 1
- 10
- 2
- a
- b
- # 使用-n
- echo "1
- 10
- 2
- a
- b
- 0a" |sort -n
- 0a
- a
- b
- 1
- 2
- 10
复制代码 从上面的排序结果来看,如果不使用-n,排序的从小到大为,空值,0,数字[1-9],字符;如果使用-n,则为空值,0,字母,字符[1-9]。
接下来我们再看下-k参数的使用,- cat file
- 1 2 8 3 3
- 2 2 8 2 2
- 3 2 8 2 1
- # 以第2个位置为关键字排序
- sort -k2 file
- 3 2 8 2 1
- 2 2 8 2 2
- 1 2 8 3 3
- # 以第2到3个位置为关键字排序
- sort -k2,3 file
- 1 2 8 3 3
- 2 2 8 2 2
- 3 2 8 2 1
- # 以第2到4个位置为关键字排序
- sort -k2,4 file
- 2 2 8 2 2
- 3 2 8 2 1
- 1 2 8 3 3
- # 以第2到5个位置(即结尾)为关键字排序
- sort -k2,5 file
- 3 2 8 2 1
- 2 2 8 2 2
- 1 2 8 3 3
复制代码 以第二列为关键字排序,可以看出来,sort -k2 是等价于sort -k2,n(结尾)的,
而sort k2,m (m<n), 则是先按照指定的位置来排序,然后再返回第一列,如果第一列相同,再从m+1到n。
如果加上 -n会是什么情况呢?
我们在理解-n参数的时候,最简单的便是让sort按照数值来排序,所以想象中,sort -n -k2 file 的执行结果是:
3 2 8 2 1
2 2 8 2 2
1 2 8 3 3
而实际呢?
- sort -n file
- 1 2 8 3 3
- 2 2 8 2 2
- 3 2 8 2 1
- sort -n -k2 file
- 1 2 8 3 3
- 2 2 8 2 2
- 3 2 8 2 1
复制代码 对照前面的sort -k2的结果, 不难看出两者的区别。
这是为什么?
我的理解是:sort 的执行顺序决定的,
sort首先执行-n命令,将所有的数据按照数值大小从第一列开始排序直到最后一列,
然后再执行k命令,按照指定位置排序,注意:这次排序只有一次,而不是从指定位置开始直到最后一列。
这样,lz的一个例子, 也就可以解释通了。
# sort -k 2 example
3 2 8 1
2 2 8 2
1 2 8 3
# sort -n -k 2 example
1 2 8 3
2 2 8 2
3 2 8 1
除此之外,-n 对 -km,n也是有影响的,如:- sort -n -k2,4 file
- 1 2 8 3 3
- 2 2 8 2 2
- 3 2 8 2 1
复制代码 可以看出来,sort -n -k2 和sort -n -k2,4的执行结果是一样的,
表明,如果有-n命令存在的时候,-km=-km,i=-km,n。
还需要注意的是,-n对-km -ki 的命令,除了按照数值大小排序,没有别的影响。
表述有些乱,大家见谅! |
|