加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

unix中以下三个排序命令有什么区别?

发布时间:2020-12-15 22:57:17 所属栏目:安全 来源:网络整理
导读:unix中的以下排序命令有何不同? 1) sort -k1,4 file2) sort -k1,1 -k4,4 file3) sort -k1,1 -k2,2 -k3,3 -k4,4 file 特别是,#1和#2令人困惑. 例如,以下示例说明了我的观点 $cat tmp1 2 3 t4 2 4 c5 4 6 c7 3 20 r12 3 5 i2 45 7 a11 23 53 b23 43 53 q11 6
unix中的以下排序命令有何不同?

1) sort -k1,4 < file
2) sort -k1,1 -k4,4 < file
3) sort -k1,1 -k2,2 -k3,3 -k4,4 < file

特别是,#1和#2令人困惑.
例如,以下示例说明了我的观点

$cat tmp
1       2       3       t
4       2       4       c
5       4       6       c
7       3       20      r
12      3       5       i
2       45      7       a
11      23      53      b
23      43      53      q
11      6       3       c
0       4       3       z

$diff <(sort -k1,4 tmp) <(sort -k1,4 tmp)
1a2
> 1     2       3       t
5,6d5
< 1     2       3       t
< 23    43      53      q
7a7
> 23    43      53      q

$diff <(sort -k1,6d5
< 1     2       3       t
< 23    43      53      q
7a7
> 23    43      53      q

我确实看了那个排序的手册页
在sort的手册页中,它说:

-k,--key=POS1[,POS2]
 start a key at POS1 (origin 1),end it at POS2 (default end of line)

但我不明白这个解释.如果它从POS1开始并在POS2结束,那么上面的#1和#3命令是否会产生相同的结果?

解决方法

区别在于#1将整行视为单个键,并按字典顺序对其进行排序.另外两个键有多个键,特别是#3使用与#1相同的字段集时,它以非常不同的方式这样做.它首先按第一列对列表进行排序(空白属于以下字段,并且重要,除非您指定-b),如果两个或多个行在第一列中具有相同的值,则它使用第二个键来排序该行的子集.如果前两列中的两行或多行相同,则使用第三个键等.

在第一种情况下,根据您的语言环境,您可以得到不同的结果(尝试LC_ALL = C sort -k1,4< file并将其与例如LC_ALL = en_US.utf8 sort -k1,4< file进行比较) . 在第二种和第三种情况下,由于在从非空白到空白的过渡中分割键.这意味着第2列和后续列具有不同大小的空白前缀,这会影响排序顺序,因为您未指定-b. 此外,如果你有一个空格和标签的混合来排列你的列,这可能会搞乱事情. 当我在我的环境中使用LC_ALL = en_US.utf8时,我得到了相同的结果,但是使用LC_ALL = C(SuSE Enterprise 11.2)的预期结果(即没有差异).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读