排序科学和浮动

时间:2014-10-13 11:45:31

标签: shell sorting floating-point

我一直在拼命地使用命令sort,从科学和浮动值中分类出正面和负面的混合物,例如:

-2.0e+00
2.0e+01
2.0e+02
-3.0e-02
3.0e-03
3.0e-02

没有浮点或没有科学指数,它可以正常工作 sort -k1 -g file.dat。如前所述同时使用两者,结果是:

-3.0e-02
-2.0e+00
2.0e+01
2.0e+02
3.0e-02
3.0e-03

这显然是错误的,因为它应该是:

-2.0e+00    
-3.0e-02
3.0e-03
3.0e-02
...

知道如何解决这个问题吗?一旦我解决了这个问题,是否有可能对绝对值进行排序(例如,摆脱负面的价值)?我知道我可以尝试对每个值进行平方,排序,取平方根。这样做我会不太精确,但是有一个好的,快速和直接的方式是很好的。

我的linux系统:8.12,版权所有©2011

非常感谢!

更新:如果我在调试模式sort -k1 -g filename.dat --debug中运行它,我得到以下结果(我把它翻译成英文,输出是德文)

 sort: the sorting rules for „de_DE.UTF-8" are used
 sort: key 1 is numerically and involves several fields
-3.0e-02
__
________
-2.0e+00
__
________
2.0e+01
_
_______
2.0e+02
_
_______
3.0e-02
_
_______
3.0e-03
_
_______

1 个答案:

答案 0 :(得分:1)

根据问题下的评论,这是一个区域设置问题:sort正在使用区域设置,期望,为小数点分隔符,而您的文字为.。理想的解决方案是让sort使用不同的语言环境,希望有人会写出正确的答案。

但是,如果您不能或不想改变sort的工作方式,那么您可以更改其获得的输入。这是最简单的方法是让sort从管道中获取输入,然后在路上修改它。在此处将.更改为,就足够了,因此选择的工具为tr

cat file.dat | tr . , | sort -k1 -g 

这个解决方案有一个很大的缺点:如果使用locale执行命令,其中sort使用.作为小数分隔符,那么这将打破排序,而不是修复。因此,如果您正在编写可在其他地方使用的shell脚本,请不要这样做。

重要提示:上面的命令有unnecessary use of cat。每个想要自己被认真对待专业shell脚本程序员的人都不要这样做!