Bash下sort命令首列数值排序无法识别科学计数法的解决方法
解决sort命令无法识别科学计数法排序的问题
这个问题我之前也踩过坑,默认的sort -n确实只能解析普通十进制浮点数,对2e-2、1.5e-5这类科学计数法完全不感冒,才会把这些值排到文件末尾。不过有两个靠谱的办法可以解决:
方法一:使用sort -g通用数值排序选项
大多数现代Linux发行版的sort都支持-g(全称--general-numeric-sort)选项,它会把字符串当成通用浮点数解析,自然就支持科学计数法了。直接把你的命令改成:
sort -k1 -g file.txt
这个命令会正确识别科学计数法的数值大小,比如把1.5e-5、2e-2、100这类值按真实数值顺序排列。
注意:如果你的第一列混有非数值内容,
-g可能会把这些行排到最前或最后,但既然你是按第一列数值排序,应该不会遇到这个问题。
方法二:用awk转换格式后再排序
如果你的系统是老版本BSD或者sort不支持-g选项,可以用awk先把科学计数法转换成普通浮点数,排序后再恢复原格式:
awk '{printf "%20f\t%s\n", $1, substr($0, index($0,$2))}' file.txt | sort -k1 -n | awk -F'\t' '{print $2}'
分步解释下这个命令:
- 第一个
awk:把第一列的科学计数法数值转成20位宽度的普通浮点数,和该行剩余内容用制表符分隔(避免排序时干扰其他列); sort -k1 -n:按转换后的第一列数值排序;- 第二个
awk:去掉前面的浮点数部分,输出原始行内容。
这种方法兼容性更强,适合不支持-g的老系统。
内容的提问来源于stack exchange,提问作者Ayn
相关产品推荐
相关产品推荐

