linux - 仅替换特定列中的字符 (CSV)

标签 linux csv awk sed

我有这样的数据:

1;2015-04-10;23:10:00;10.4.2015 23:10;8.9;1007.5;0.3;0.0;0;55
2;2015-04-10;23:20:00;10.4.2015 23:20;8.6;1007.8;0.4;0.0;0;56
3;2015-04-10;23:30:00;10.4.2015 23:30;8.5;1008.1;0.4;0.0;0;57

它有点 . 作为小数点分隔符,但我需要使用 , 代替。

所需数据:

1;2015-04-10;23:10:00;10.4.2015 23:10;8,9;1007,5;0,3;0,0;0;55

我尝试使用 Sed。使用 sed -i 's/\./,/g' myfile.csv 我可以用逗号替换所有点,但会破坏第四列中的日期。如何将其他地方的点更改为逗号,但保持第四列不变?如果其他一些 Linux 工具比 Sed 更适合这项任务,我也可以使用它。

最佳答案

sed 用于简单的替换,对于任何其他只需使用 awk:

$ awk 'BEGIN{FS=OFS=";"} {for (i=5;i<=NF;i++) sub(/\./,",",$i)} 1' file
1;2015-04-10;23:10:00;10.4.2015 23:10;8,9;1007,5;0,3;0,0;0;55
2;2015-04-10;23:20:00;10.4.2015 23:20;8,6;1007,8;0,4;0,0;0;56
3;2015-04-10;23:30:00;10.4.2015 23:30;8,5;1008,1;0,4;0,0;0;57

关于linux - 仅替换特定列中的字符 (CSV),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30578219/

相关文章:

javascript - 有没有办法运行代码到 "certain point",退出,然后再次开始运行而不会中断

csv - awk:如何过滤掉所有条目(16 列)都为 0 的行

linux - 创建一个像普通菜单一样弹出但出现在鼠标位置的 float 菜单

linux - 如何仅使用 shell 命令编辑文件以保持相同长度的行

http - 将什么设置为 mimetype 以便 CSV 文件在电子表格应用程序中打开

bash - 如何过滤掉./gradle project:dependencies命令的特定部分? (版本2)

bash - 在文本文件中,根据另一个文件将模式替换为其他模式

awk 打印行组的总和

c++ - 如何以编程方式将路由添加到网络接口(interface)

linux - ElementaryOS Freya - Dropbox 图标