Unix sort按第3列排序异常问题求助
关于GNU sort按第3列数值排序异常的问题
原文件内容
tcsh 541% cat file 2,2587,769,629,629,629,890,890,890,890,89,801,0,184,24944,8018,42839 1,2622,867,686,686,686,880,880,880,880,88,792,0,246,25551,7977,43721 3,2636,736,700,700,700,1083,880,880,880,88,792,0,260,25439,7984,43758
正常排序情况
按第1列数值排序(sort -t, -nk1 file)输出正常:
tcsh 533% sort -t, -nk1 file 1,2622,867,686,686,686,880,880,880,880,88,792,0,246,25551,7977,43721 2,2587,769,629,629,629,890,890,890,890,89,801,0,184,24944,8018,42839 3,2636,736,700,700,700,1083,880,880,880,88,792,0,260,25439,7984,43758
按第2列数值排序(sort -t, -nk1 file | sort -t, -nk2)输出正常:
tcsh 534% sort -t, -nk1 file | sort -t, -nk2 2,2587,769,629,629,629,890,890,890,890,89,801,0,184,24944,8018,42839 1,2622,867,686,686,686,880,880,880,880,88,792,0,246,25551,7977,43721 3,2636,736,700,700,700,1083,880,880,880,88,792,0,260,25439,7984,43758
异常排序情况
按第3列数值排序时,无论是否先按第1列排序,输出都不符合预期:
tcsh 535% sort -t, -nk1 file | sort -t, -nk3 2,2587,769,629,629,629,890,890,890,890,89,801,0,184,24944,8018,42839 1,2622,867,686,686,686,880,880,880,880,88,792,0,246,25551,7977,43721 3,2636,736,700,700,700,1083,880,880,880,88,792,0,260,25439,7984,43758 tcsh 532% sort -t, -nk3 file 2,2587,769,629,629,629,890,890,890,890,89,801,0,184,24944,8018,42839 1,2622,867,686,686,686,880,880,880,880,88,792,0,246,25551,7977,43721 3,2636,736,700,700,700,1083,880,880,880,88,792,0,260,25439,7984,43758
预期输出
tcsh 532% sort -t, -nk3 file 3,2636,736,700,700,700,1083,880,880,880,88,792,0,260,25439,7984,43758 2,2587,769,629,629,629,890,890,890,890,89,801,0,184,24944,8018,42839 1,2622,867,686,686,686,880,880,880,880,88,792,0,246,25551,7977,43721
使用的sort版本
542% sort --version sort (GNU coreutils) 8.22 Copyright (C) 2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Written by Mike Haertel and Paul Eggert
排查与解决方案
问题原因:GNU sort的
-k选项若仅指定列号(如-k3),默认会从该列开始匹配到行尾进行排序。旧版本(如8.22)的sort在处理数值排序时,可能将后续字段内容纳入比较逻辑,导致结果异常;本质是命令写法未明确限定仅对第3列排序。修复命令:明确指定排序的起始和结束列(
-k3,3),确保仅针对第3列单独进行数值排序:
sort -t, -n -k3,3 file
执行该命令后输出将符合预期:
3,2636,736,700,700,700,1083,880,880,880,88,792,0,260,25439,7984,43758 2,2587,769,629,629,629,890,890,890,890,89,801,0,184,24944,8018,42839 1,2622,867,686,686,686,880,880,880,880,88,792,0,246,25551,7977,43721
- 额外排查点:若修复命令仍无效,需检查文件是否存在隐藏字符(如空格、特殊换行符),可通过
cat -A file查看原始字符,确认第3列数值后仅为逗号,无其他不可见字符。
内容的提问来源于stack exchange,提问作者arun
相关产品推荐
相关产品推荐

