Преобразование чисел с плавающей запятой в десятичные числа

perl -pe 's/begin\(/$&. ++$n/ge' < input-file

Или для оперативного редактирования (который является заменой файл с измененной копией себя):

perl -pi.back -e 's/begin\(/$&. ++$n/ge' input-and-output-file

(удалите .back если Вы чувствуете себя предприимчивыми и не нуждаетесь в резервном копировании).

Вышеупомянутые замены когда-либо begin( с тем же ($&) с увеличенным значением $n переменная (++$n) добавленный (.).

Если Вы хотите заменить begin() вместо begin(:

perl -pe 's/begin\(\K\)/++$n.")"/ge' < input-file
3
16.10.2015, 15:14
4 ответа

Сценарий sed избавляется от пробела после 'e', а сценарий awk просто выводит каждое поле (умножая $3 на 1, чтобы "преобразовать" его в десятичное число, не являющееся дробью):

$ sed -e 's/e /e/g' file | awk '{print $1, $2, $3 * 1}'
1 1 1423
1 2 1589
1 3 85000
1 4 8900
1 5 8796

Это предполагает, что числа с плавающей запятой в файле:

  1. имеют лишний пробел после 'e'
  2. опускают '+' для положительных экспонент
  3. не имеют очень больших экспонент, иначе awk выведет их как fp.

Можно заставить awk выполнять преобразование 's/e /e/' (так что sed не нужен), но уже поздно и мой мозг устал. sed | awk - это просто и работает.

3
27.01.2020, 21:11

Более строгим подходом было бы выполнение checkbashisms на скриптах, чтобы проверить, действительно ли они sh - совместимы. Как bash , так и ksh смогут выполнять такие сценарии просто нормально. Но опять же, в случае каких-либо проблем придется исправлять сценарии вручную.

-121--199253-

Это можно сделать и в кроне. Просто добавьте в/etc/crontab:

@reboot /bin/sleep 600 && COMMAND
-121--121299-
{ sed 's/ /+/3' | xargs printf '%G% G% G\n'; } <in >out

1 1 1423
1 2 1589
1 3 85000
1 4 8900
1 5 8796

Вы хотите играть с % G точности флагов, если числа становятся намного больше, чем это.

2
27.01.2020, 21:11

Это выполнит преобразование:

awk '{print $1, $2, $3 * 10**$4}' file.csv

Предполагая:

  1. Между e и фактической экспонентой есть пробел.
  2. Показатель степени - это последнее поле каждой строки.

Если требуется определенный формат, можно использовать некоторую форму printf .

Например:

awk '{printf( "%s %s %g "ORS,$1,$2,$3*10**$4)}' file.csv

может напечатать это:

1 1 1423 
1 2 1589 
1 3 85000 
1 4 8900 
1 5 8796 
2 8 2.589e+28

Последняя строка добавлена, чтобы показать окончательный формат для больших экспонент.

2
27.01.2020, 21:11

Другой вариант с awk sprintf

awk 'NF==4{$(NF-1)=sprintf(CONVFMT, $(NF-1)$NF);NF=3}1' file
1
27.01.2020, 21:11

Теги

Похожие вопросы