bash将每个其他逗号更改为point

时间:2016-07-14 08:11:52

标签: linux bash shell unix sh

我正在处理以瑞典格式编写的数据集。瑞典使用逗号代替十进制数字。

我的数据集是这样的:

1,188,1,250,0,757,0,946,8,960

1,257,1,300,0,802,1,002,9,485

1,328,1,350,0,846,1,058,10,021

1,381,1,400,0,880,1,100,10,418

我希望将每个其他逗号更改为指向并输出如下:

1.188,1.250,0.757,0.946,8.960

1.257,1.300,0.802,1.002,9.485

1.328,1.350,0.846,1.058,10.021

1.381,1.400,0.880,1.100,10.418

有关如何使用简单的shell脚本执行此操作的任何想法。这很好如果我分多步完成。我的意思是,如果我首先更改逗号的第一个实例,然后更改第三个实例...

非常感谢你的帮助。

4 个答案:

答案 0 :(得分:6)

使用sed

sed 's/,\([^,]*\(,\|$\)\)/.\1/g' file

1.188,1.250,0.757,0.946,8.960

1.257,1.300,0.802,1.002,9.485

1.328,1.350,0.846,1.058,10.021

1.381,1.400,0.880,1.100,10.418

答案 1 :(得分:1)

供参考,以下是使用awk实现转化的可能方法:

awk -F, '{for(i=1;i<=NF;i=i+2) {printf $i "." $(i+1); if(i<NF-2) printf FS }; printf "\n" }' file

for循环迭代由逗号分隔的每2个字段(由选项-F,设置)并打印当前元素,下一个以点分隔。

除了在行尾之外,将打印由FS表示的逗号分隔符。

答案 2 :(得分:0)

作为Perl单线程,使用分割和数组操作:

perl -F, -e '@a = @b = (); while (@b = splice @F, 0, 2) {
             push @a, join ".", @b} print join ",", @a' file

输出:

1.188,1.250,0.757,0.946,8.960

1.257,1.300,0.802,1.002,9.485

1.328,1.350,0.846,1.058,10.021

1.381,1.400,0.880,1.100,10.418

答案 3 :(得分:0)

许多sed方言允许您通过指定s///的数字选项来指定要替换的模式的哪个实例。

sed -e 's/,/./9' -e 's/,/./7' -e 's/,/./5' -e 's/,/./3' -e 's/,/./'

ISTR一些sed方言可以让你将其简化为

sed 's/,/./1,2'

但我的Debian不支持。

演示:http://ideone.com/6s2lAl