Как изменить десятичный разделитель с помощью awk / sed? - PullRequest
8 голосов
/ 09 августа 2010

Как изменить числовой формат (другой десятичный разделитель) с XXXXXX.XXX на XXXXXX,XXX, используя sed или awk?

Ответы [ 8 ]

8 голосов
/ 25 ноября 2011

Насколько строгим ты хочешь быть?Вы можете изменить все . символов, как предлагали другие, но это даст много ложных срабатываний, если у вас будет больше, чем просто цифры.Немного строгим было бы потребовать, чтобы по обе стороны от точки были цифры:

$ 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, но обрабатывает "нормальные "номера чисто.

7 голосов
/ 25 ноября 2011

Разве это не будет более точным, поскольку ОП говорит о числах ... чтобы убедиться, что это точка перед точкой.Документ может содержать другие точки, которые ОП не хочет заменять.

sed '/[0-9]\./s/\./,/g'
2 голосов
/ 13 марта 2016

Если вы хотите заменить десятичный разделитель для косметических целей

В большинстве случаев tr, вероятно, самый простой способ замены символов:

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

Конечно, если вы имеете дело свводя числа и строки для смешивания, вам потребуется более надежный подход, например, предложенный Майклом Дж. Барбером или даже более.

Если вы хотите заменить десятичный разделитель для вычислительных целей

По умолчанию gawk (GNU awk, то есть awk большинства дистрибутивов GNU / Linux) использует точку в качестве десятичного разделителя:

$ 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

( Кредиты и другие ссылки )

2 голосов
/ 09 августа 2010

Вы можете сделать это:

echo "XXX.XX" | sed s/\./,/g
1 голос
/ 12 мая 2018

Чтобы заменить только десятичные запятые в этой строке:

Total,"14333,374","1243750945,5","100,00%","100,00%","100,00%",1 639 600,"100,00%"

Я использовал обратные ссылки (и MacOSX, поэтому мне нужна опция -E):

echo 'Total,"14333,374","1243750945,5","100,00%","100,00%","100,00%",1 639 600,"100,00%"'  | sed -E 's/("[0-9]+),([0-9]+%?")/\1\.\2/g' 

в результатев

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

Команда sed говорит: «Найдите каждую строку формы 'двойные кавычки digit_1, digit_2, затем один или ноль%, двойные кавычки' и замените ее first_match.second_match."

1 голос
/ 09 августа 2010

если у вас есть bash / ksh и т. Д.

var=XXX.XXX
echo ${var/./,}
1 голос
/ 09 августа 2010

Я думаю,

s/\./,/g

должно служить тому, что вы хотите ... если вы не хотите чего-то более особенного ...

0 голосов
/ 09 августа 2010

Поскольку вопрос также помечен awk:

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