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)
根据问题下的评论,这是一个区域设置问题:sort正在使用区域设置,该区域设置需要,小数点分隔符,而您的文本具有.. 理想的解决方案是使用sort不同的区域设置,希望有人会写出涵盖该区域的正确答案。
但是,如果您不能或不想更改sort工作方式,那么您可以更改它获得的输入。最简单的方法是sort从管道获取输入,并在途中修改它。.这里将每个更改为就足够了,,因此选择的工具是tr:
cat file.dat | tr . , | sort -k1 -g
Run Code Online (Sandbox Code Playgroud)
这个解决方案有一个很大的缺点:如果使用排序作为小数分隔符的语言环境执行命令.,那么这将破坏排序,而不是修复。因此,如果您正在编写可能在其他地方使用的 shell 脚本,请不要这样做。
重要提示:上面的命令不必要地使用了cat。每个希望自己被认真对待为专业 shell 脚本程序员的人,不要这样做!