使所有小数都等于 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
我有一个结构如下的 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