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

如何使用awk/sed更改小数分隔符?,sed,awk,Sed,Awk,如何使用sed或awk将数字格式(不同的十进制分隔符)从XXXXXX.XXX更改为XXXXXX,XXX?您可以这样做: echo "XXX.XX" | sed s/\./,/g 我想 s/\./,/g 应该满足你的需要。。。除非你想要更特别的东西…因为问题也被标记为awk: awk 'gsub(/\./,",")||1' 如果您有bash/ksh等 var=XXX.XXX echo ${var/./,} 当OP What谈论数字时,这不是更准确吗。。确保它是点之前的前导数字。文件可能包含

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

您可以这样做:

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

s/\./,/g

应该满足你的需要。。。除非你想要更特别的东西…

因为问题也被标记为
awk

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

如果您有bash/ksh等

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

当OP What谈论数字时,这不是更准确吗。。确保它是点之前的前导数字。文件可能包含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.0
a1.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
但是您可以使用
--使用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

()

仅替换此行中的十进制逗号:

Total,"14333,374","1243750945,5","100,00%","100,00%","100,00%",1 639 600,"100,00%"
我使用了反向引用(和MacOSX,所以我需要-E选项):

导致

Total,"14333.374","1243750945.5","100.00%","100.00%","100.00%",1 639 600,"100.00%"

sed命令说:“找到“双引号数字1,数字2,后跟1或0%,双引号”形式的每个字符串,并用第一个匹配项替换。第二个匹配项替换。”

不必使用| 1,
awk'gsub(/\./,“,”)
@ghostdog74
gsub
返回替换的数量,您的版本跳过至少不包含一个点的行。我对OP的输入数据知之甚少,因此忽略了
|124; 1
。很好,这里有一个更麻烦的方法可以在所有POSIX shell中使用:
var=XXX.XXX;echo${var%.*},${var###*.}
如果文本中有点分隔符,这将不起作用
Total,"14333.374","1243750945.5","100.00%","100.00%","100.00%",1 639 600,"100.00%"