使用Unix sort对含科学计数法的两列数据排序的问题
关于GNU sort多列排序(含科学计数法)的问题
测试数据
test文件内容:
A 2e-12 A 3e-14 A 1e-15 A 1.2e-13 B 1e-13 B 1e-14 C 4e-12 C 3e-12
预期排序结果
先按第一列字符串排序,再按第二列科学计数法数值升序排序:
A 1e-15 A 3e-14 A 1.2e-13 A 2e-12 B 1e-14 B 1e-13 C 3e-12 C 4e-12
尝试过程及问题
- 单独对第二列按数值排序可正常工作,命令:
sort -g -k2 test,输出:
sort -g -k2 test A 1e-15 B 1e-14 A 3e-14 B 1e-13 A 1.2e-13 A 2e-12 C 3e-12 C 4e-12
尝试多列排序时,以下命令均未得到预期结果:
sort -k1,1 -g test sort -k1,1 -g -k1,2 test sort -k1,1 -g -k2,1 test错误输出:
A 1.2e-13 A 1e-15 A 2e-12 A 3e-14 B 1e-13 B 1e-14 C 3e-12 C 4e-12另一组测试命令:
sort -g -k2 -k1 test sort -g -k2 -k1,1 test sort -g -k2,2 -k1,1 test sort -k1,1 -g -k2,2 test sort -k1,1 -g -k2,2 test错误输出:
A 1e-15 B 1e-14 A 3e-14 B 1e-13 A 1.2e-13 A 2e-12 C 3e-12 C 4e-12已尝试设置
LANG=C和LC_ALL=C,问题未解决。当前环境:Red Hat,GNU coreutils 8.22版本。
解决方案
正确的排序命令为:
sort -k1,1 -k2,2g test
命令解释
-k1,1:指定第一列为第一排序键,仅对第一列进行字符串排序。-k2,2g:指定第二列为第二排序键,后缀g表示对该列使用数值排序(支持科学计数法),且仅作用于第二列。
正确输出
执行上述命令后,得到预期结果:
A 1e-15 A 3e-14 A 1.2e-13 A 2e-12 B 1e-14 B 1e-13 C 3e-12 C 4e-12
内容的提问来源于stack exchange,提问作者CGanote
相关产品推荐
相关产品推荐

