使所有小数都等于 sed

Making all the decimals equal with 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

有什么想法吗?

也许需要脚本?

Perl 来拯救!

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

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

您可以使用

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

得到你想要的输出。

在sed中,需要区分两种情况:只有一个小数位,或者有两个以上。

sed -E 's/(;[0-9]+)\.([0-9])(;[^;]*;[^;]*)$/./' \
    -E 's/(;[0-9]+)\.([0-9]{2})[0-9]+(;[^;]*;[^;]*)$/./'
$ awk '{$(NF-2) = sprintf( "%0.2f", $(NF-2))}1' FS=\; OFS=\; input
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.35;;S

这可能适合您 (GNU sed):

sed -E 's/^/;/;s/;[0-9]*\.[0-9]*/&00/g;s/(;[0-9]*\.[0-9]{2})[^;]*//g;s/.//' file

在行首添加一个 csv 定界符,以便全局正则表达式匹配成功。

如果一个字段看起来像小数;追加两个 0

如果一个字段看起来像小数;将它缩短到小数点后两位。

删除引入的 csv 分隔符。

N.B。这不考虑四舍五入。


如果需要四舍五入可能:

sed -E 's/^/;/;s/;([0-9]*\.[0-9]*)/$(printf ";%.2f" )/g;s/.(.*)/echo ""/e' file