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