如何用awk / sed更改小数分隔符?

时间:2010-08-09 10:11:36

标签: sed awk

如何使用XXXXXX.XXXXXXXXX,XXX将数字格式(不同的小数点分隔符)从sed更改为awk

7 个答案:

答案 0 :(得分:8)

你想要多严谨?您可以像其他人建议的那样更改所有.个字符,但如果您拥有的不仅仅是数字,那么这将允许大量的误报。更严格的是要求点的两边都有数字:

$ echo 123.324 2314.234 adfdasf.324 1234123.daf 255.255.255.0 adsf.asdf a1.1a |
>   sed 's/\([[:digit:]]\)\.\([[:digit:]]\)/\1,\2/g'
123,324 2314,234 adfdasf.324 1234123.daf 255,255,255,0 adsf.asdf a1,1a

这确实允许更改几个奇怪的情况,即255.255.255.0a1.1a,但干净地处理“正常”数字。

答案 1 :(得分:7)

这不会更准确,因为OP谈论数字......以确保它是点之前的前导数字。该文件可能包含OP不想替代的其他点。

sed '/[0-9]\./s/\./,/g'

答案 2 :(得分:2)

你可以这样做:

echo "XXX.XX" | sed s/\./,/g

答案 3 :(得分:2)

如果要替换小数分隔符以用于装饰目的

在大多数情况下,tr可能是替换字符的最简单方法:

$ echo "0.3"|tr '.' ','
0,3

当然,如果您处理输入混合数字和字符串,您将需要一种更强大的方法,如Michael J. Barber提出的方法或更多方法。

如果要为计算目的替换小数分隔符

默认情况下gawk(GNU awk,即大多数GNU / Linux发行版的awk)使用点作为小数分隔符:

$ echo $LC_NUMERIC
fr_FR.UTF-8
$ echo "0.1 0.2"|awk '{print $1+$2}'
0.3
$ echo "0,1 0,2"|awk '{print $1+$2}'
0

然而您可以使用--use-lc-numeric选项强制它使用当前区域设置的小数点分隔符

$ echo $LC_NUMERIC
fr_FR.UTF-8
$ echo "0.1 0.2"|awk --use-lc-numeric '{print $1+$2}'
0
$ echo "0,1 0,2"|awk --use-lc-numeric '{print $1+$2}'
0,3

如果输入格式与当前区域设置不同,您当然可以暂时重新定义LC_NUMERIC:

$ echo $LC_NUMERIC
fr_FR.UTF-8
$ echo "0.1 0.2"|LC_NUMERIC=en_US.UTF-8 awk --use-lc-numeric '{print $1+$2}'
0
$ echo "0,1 0,2"|LC_NUMERIC=fr_FR.UTF-8 awk --use-lc-numeric '{print $1+$2}'
0,3

Credits and other links

答案 4 :(得分:1)

我认为

s/\./,/g

应该满足你想要的......除非你想要更特别的东西......

答案 5 :(得分:1)

如果你有bash / ksh等

var=XXX.XXX
echo ${var/./,}

答案 6 :(得分:0)

由于问题也标记为awk

awk 'gsub(/\./,",")||1'