bash sort 命令的用法

给定一个 test.txt

banana,2,8
apple,2,7
cherry,2,9
banana,3,4
cherry,3,5
apple,3,10

sort 命令默认按照字典从左到右逐个字符依次从小到大排序, 空格制表符是默认域分隔符 ,字典顺序是基于Unicode 字符编码的值来排序的

默认排序:

$ cat test.txt | sort

apple,2,7
apple,3,10
banana,2,8
banana,3,4
cherry,2,9
cherry,3,5

以 , 为分隔符 从第二列开始到第二列结束以数值排序

$ cat test.txt | sort -t ',' -k 2,2n

apple,2,7
banana,2,8
cherry,2,9
apple,3,10
banana,3,4
cherry,3,5

以 , 为分隔符 从第二列开始到第二列结束以数值排序,当第二列数值相同,  从第三列开始到第三列结束以数值排序

$ cat test.txt | sort -t ',' -k 2,2n -k 3,3n
apple,2,7
banana,2,8
cherry,2,9
banana,3,4
cherry,3,5
apple,3,10

 

下面两种结果都是一样的, 

-k 后的范围跨列后有下面的规则

  • -k 2,3 指从第二列到第三列, 这是一个整体, 并且包含其中的域分隔符
  • -k 后如果指定范围 比如 -k 2,3 那么只要写一个n  就可以表示按照数值排序, 写多个和写一个一样...
  • 按照上面的规则-k 2,3n   -k 2n,3        -k 2n,3n        -k 2,3n  都是一个意思, 都表示 从第二列到第三列包含其中的域分隔符这个整体 用数值排序
  • 一般域分隔符都不是数字, 所以一般 -k 后加上范围后, 哪怕指定了 数值排序也不生效,默认还是按照字典排序

知道上面的规则后下面就好理解了

$ cat test.txt | sort -t ',' -k 2,3n
apple,2,7
banana,2,8
cherry,2,9
apple,3,10
banana,3,4
cherry,3,5

 

当我们替换用6替换, 作为分隔符,后续就把6当作分隔符

banana60268
apple6267
cherry6269
banana6364
cherry6365
apple63610

 

$ cat test.txt | sort -t '6' -k 2,3n
apple6267
banana60268
cherry6269
banana6364
cherry6365
apple63610

按照数值排序成功, 能看到 2 等于 02, 切第二列到第三列换行符包含进来后组成了一列的新数字,3610 成功的排到了最大

 

$ cat test.txt | sort -t '6' -k 2,3
banana60268
apple6267
cherry6269
apple63610
banana6364
cherry6365

能够看到当使用默认字典排序的时候, 02 是排在最前面的, 因为0 在Unicode  码表里面比较小, 且 3610 因为中间的1 比后面的 4 小,所以排在了中间

 

posted @ 2024-11-15 14:01  黑山老猫  阅读(26)  评论(0编辑  收藏  举报