首页 > 解决方案 > 用 sed 使所有小数相等

问题描述

我有一个具有这种结构的 csv 文件:

123;rr;2;RRyO, chess mobil;pio;25.766;1;0;24353;21.6;;S
1243;rho;9;RpO, chess yext cat;downpio;67.98;1;0;237753;25.34600;;S

我希望特定列的所有数字只有 2 位小数(添加或删除小数)。

有了这个输出

123;rr;2;RRyO, chess mobil;pio;25.766;1;0;24353;21.60;;S
1243;rho;9;RpO, chess yext cat;downpio;67.98;1;0;237753;25.34;;S

我试过这个,但不起作用

sed 's/[[:digit:]]*\.//g' data.csv

任何想法?

也许需要一个脚本?

标签: csvseddecimal

解决方案


Perl 来救援!

perl -F\; -ne '$F[9] = sprintf "%.2f", $F[9]; print join ";", @F' -- file.csv

请注意,它将第 2 行的值设置为25.35,而不是25.34,因为这就是%frounds的方式25.346

您可以使用

$F[9] = sprintf "%.2f", int($F[9] * 100) / 100

得到你想要的输出。

在 sed 中,您需要区分这两种情况:只有一个十进制,或者有两个以上。

sed -E 's/(;[0-9]+)\.([0-9])(;[^;]*;[^;]*)$/\1.\20\3/' \
    -E 's/(;[0-9]+)\.([0-9]{2})[0-9]+(;[^;]*;[^;]*)$/\1.\2\3/'

推荐阅读