如何用Linux命令实现反向排序?求sort与AWK用法指导
用sort命令调整中间列排序
你已经用到了sort -k2,2nr,这个命令是按第2列数值降序排序(n表示数值排序,r表示反向)。如果要调整中间某列(比如第3列),只需要把k参数的列号改成目标列即可:
- 按第3列数值反向排序:
sort -k3,3nr file.txt - 按第3列字典序反向排序(不需要
n参数):sort -k3,3r file.txt - 多列组合排序(比如先按第1列正序,再按第3列数值降序):
sort -k1,1 -k3,3nr file.txt
-k参数的格式是-k起始列,结束列,如果只写-k3会从第3列一直到行尾都参与排序,加上,3可以限定只按第3列排序,避免干扰。
用AWK实现自定义反向排序
AWK可以通过数组存储行内容,再自定义排序逻辑来实现。以下是两种常见场景的实现:
1. 按指定列(比如第2列)数值反向排序
创建一个脚本文件(比如reverse_sort.awk),内容如下:
# 存储每行内容和目标列的数值 { lines[NR] = $0 nums[NR] = $2 } END { # 冒泡排序:按数值降序排列 for (i = 1; i <= NR; i++) { for (j = i + 1; j <= NR; j++) { if (nums[i] < nums[j]) { # 交换行内容 temp_line = lines[i] lines[i] = lines[j] lines[j] = temp_line # 交换对应数值 temp_num = nums[i] nums[i] = nums[j] nums[j] = temp_num } } } # 输出排序后的行 for (i = 1; i <= NR; i++) { print lines[i] } }
运行命令:awk -f reverse_sort.awk file.txt
2. 按指定列(比如第3列)字典序反向排序
如果是字符串排序,直接提取目标列字符串并比较即可,修改脚本如下:
# 存储每行内容和目标列的字符串 { lines[NR] = $0 strs[NR] = $3 } END { for (i = 1; i <= NR; i++) { for (j = i + 1; j <= NR; j++) { if (strs[i] < strs[j]) { # 交换行内容和对应字符串 temp_line = lines[i] lines[i] = lines[j] lines[j] = temp_line temp_str = strs[i] strs[i] = strs[j] strs[j] = temp_str } } } for (i = 1; i <= NR; i++) print lines[i] }
AWK的优势是可以实现更复杂的自定义排序逻辑(比如多列组合的复杂判断),而sort命令更适合简单快速的排序需求。
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

