排序科学和浮动

Jan*_*Jan 5 sorting floating-point shell

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

-2.0e+00
2.0e+01
2.0e+02
-3.0e-02
3.0e-03
3.0e-02
Run Code Online (Sandbox Code Playgroud)

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

-3.0e-02
-2.0e+00
2.0e+01
2.0e+02
3.0e-02
3.0e-03
Run Code Online (Sandbox Code Playgroud)

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

-2.0e+00    
-3.0e-02
3.0e-03
3.0e-02
...
Run Code Online (Sandbox Code Playgroud)

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

我的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
_
_______
Run Code Online (Sandbox Code Playgroud)

hyd*_*yde 3

根据问题下的评论,这是一个区域设置问题:sort正在使用区域设置,该区域设置需要,小数点分隔符,而您的文本具有.. 理想的解决方案是使用sort不同的区域设置,希望有人会写出涵盖该区域的正确答案。

但是,如果您不能或不想更改sort工作方式,那么您可以更改它获得的输入。最简单的方法是sort从管道获取输入,并在途中修改它。.这里将每个更改为就足够了,,因此选择的工具是tr:

cat file.dat | tr . , | sort -k1 -g 
Run Code Online (Sandbox Code Playgroud)

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

重要提示:上面的命令不必要地使用了cat。每个希望自己被认真对待为专业 shell 脚本程序员的人,不要这样做!