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

问题描述:

如何使用sedawkXXXXXX.XXX的数字格式(不同的小数点分隔符)从XXXXXX.XXX更改为XXXXXX,XXX?除非ü想要的东西比较特殊如何用awk/sed更改小数点分隔符?

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

你可以这样做也标记为awk

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

我觉得

s/\./,/g 

应该成为ü想什么......

既然问题是:

+0

不必使用|| 1'的awk“GSUB(/\./ “”)' – ghostdog74 2010-08-09 10:42:07

+0

@ ghostdog74'gsub'返回更换的次数,您的版本跳过该行不要包含至少一个点。我不太了解OP的输入数据以省略“|| 1”。 – schot 2010-08-09 10:59:44

如果你有庆典/ KSH等

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

不错,这是一个更麻烦的工作在所有POSIX shell: 'var = XXX.XXX; echo $ {var%。*},$ {var ## *。}' – schot 2010-08-09 11:28:27

这是不是可以作为OP whas谈论的数字更准确..以确保它是点之前领先的数字。该文件可以包含OP不想取代的其他点。

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

你想成为多么严谨?正如其他人所建议的那样,您可以更改所有.字符,但如果您的数字不仅仅是数字,则会导致大量误报。严格的有点是要求有在点两侧的数字:

$ 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的变化,但干净处理“正常”的数字。

如果你想更换小数点分隔符以美容为目的

在大多数情况下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