2015-01-04 4 views
0

Это выход пример я получаю в некоторых программах:Linux оболочки: Изменение десятичного (флоат) разделитель от точки до запятой

$ reportspeed 
Speed.GPU.#*...: 254.4 kH/s 

И это еще один пример:

$ reportspeed 
Speed.GPU.#*...: 254.43 kH/s 

Как долго поскольку в обоих случаях очевидно, что эти один или два числа за точкой . являются десятичной частью, я хотел бы изменить этот вывод на:

$ reportspeed | decimalcomma 
Speed.GPU.#*...: 254,4 kH/s 
$ reportspeed | decimalcomma 
Speed.GPU.#*...: 254,43 kH/s 

Это: с помощью запятой , вместо ., если есть один или два десятичных знаков позади него.
Это предполагает, что, когда какая-то программа использует .точки для тысяч сепаратора, он не будет изменен, как в:

$ anotherprogram 
Speed.Other.Thing....: 33.112 H/s 
$ anotherprogram | decimalcomma 
Speed.Other.Thing....: 33.112 H/s 

Я думаю, что это может быть сделано с помощью СЕПГ AWK, Perl или, возможно, даже расширение оболочки, но я не очень разбираюсь в этом.

Не могли бы вы мне помочь, пожалуйста?

EDIT-1: Даже если этот вопрос запрашивает решения для «одного или двух чисел за точкой» в качестве метода различения запятой для тысяч, для тех, кто прибывает сюда, заинтересован в не таких ограничениях (и до тех пор, пока заголовок мог предположить, что он не существует), вот способ, во-первых, предложенный @almas Шейхом (спасибо тебе, мальчик):

sed 's/\([0-9]\)\.\([0-9]\)/\1,\2/g' 

ответ

1

вы можете использовать эту СЭД:

sed -r 's/\.([0-9]{1,2})\b/,\1/g' 

Тестирование:

cat file 
Speed.GPU.#*...: 254.4 kH/s 
Speed.GPU.#*...: 254.43 kH/s 
Speed.Other.Thing....: 33.112 H/s 

sed -r 's/\.([0-9]{1,2})\b/,\1/g' f 
Speed.GPU.#*...: 254,4 kH/s 
Speed.GPU.#*...: 254,43 kH/s 
Speed.Other.Thing....: 33.112 H/s 

PS: Об использовании OSX:

sed -E 's/\.([0-9]{1,2})[[:>:]]/,\1/g' 
0

Попробуйте что-то вроде:

sed 's/\([0-9]\)\.\([0-9]{1,2}\)/\1,\2/g' myfile.txt 
+0

Ошибка при наличии более двух знаков после запятой после '.', как в' Speed.Other.Thing ....: 33.112 H/s'. –

+0

Я не понял? когда я запускаю «эхо» almas.shaikh .... 2.34 3.2222 "| выше command' я получаю 'almas.shaikh .... 2,34 3,2222', который, я думаю, верен? – SMA

+0

Первоначальное предложение: «использование запятой', 'вместо' .', если за ним стоит один или два десятичных символа ». Число тридцать тысяч может быть написано '30000' или' 30.000', но '300.00' никогда не будет тридцать тысяч, поэтому мы можем быть уверены, что эта точка'.'является разделителем по плавающей позиции и меняет его на', '. Извините за двусмысленность в вопросе. –

1

попробовать это

$ echo "Speed.GPU.#*...: 254.4 kH/s" |sed 's/\.\([0-9]\{1,2\}\)\b/,\1/g' 
Speed.GPU.#*...: 254,4 kH/s 
$ echo "Speed.GPU.#*...: 254.44 kH/s" |sed 's/\.\([0-9]\{1,2\}\)\b/,\1/g' 
Speed.GPU.#*...: 254,44 kH/s 
$ echo "Speed.GPU.#*...: 254.444 kH/s" |sed 's/\.\([0-9]\{1,2\}\)\b/,\1/g' 
Speed.GPU.#*...: 254.444 kH/s 
1

Что вы спрашиваете невозможно. Как бедная программа должна знать, является ли число, например 33.112, европейской нотацией для «тридцать три тысячи сто двенадцать» или англоязычной нотации для «тридцать три пункта одна на две»?

+0

Я вообще не прошу про программу, способную отличить то, что имеет значение '.' или', '. Мне просто нужен метод (псевдоним, скрипт, команда), который помогает «использовать [изменение] запятой', 'вместо'. ', Если за ним стоит один или два десятичных символа», чтобы реализовать его в моих программах для некоторых данных outputing. –

+0

Вы на 100% уверены, что ни одна из этих «некоторых программ» не выводит три знака после запятой? У вас есть исходный код для них? Если нет, вы наступаете на очень тонкий лед. – TonyK

+0

Очевидно. Это «мои программы», как сказано. Во всяком случае, любой, кто использует ответы на эту тему в своих целях, должен убедиться, что вы, между прочим, правите трех десятичных знаков. Но тем не менее, то, что задает первоначальный вопрос, далеко нельзя считать «невозможным». –