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 小,所以排在了中间