如何使用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
(GNUawk
,即大多数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(/\./,“,”)
@ghostdog74gsub
返回替换的数量,您的版本跳过至少不包含一个点的行。我对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%"