csv - 用 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
rounds的方式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/'
推荐阅读
- mongodb - 如何在 MongoDB 中将字符串类型替换为对象数组的日期类型?
- javascript - 无法连续两次启动相同的动画
- api - Google maps api geocoder - 限制在多个国家
- webpack - 为什么 webpack 在我的 umd 模块中捆绑浏览器 atob?
- java - 确定为什么在创建新对象后不重新创建类级别字段
- pytorch - CUDA中的相同计算在pytorch中输出不同?
- vba - Excel VBA ,所有匹配的行必须返回到列表框或组合框
- wordpress - 缺少编辑器,外观 Wordpress 主题 Activello
- c++ - 内核上的 CUDA 非法内存访问
- c++ - 如何转换 std::array
到 char (&dest)[N]?