Преобразование числа десятичных знаков через текстовый файл

Решение этого вопроса может вращаться вокруг perl, sed или awk и, к сожалению, я не знаком ни с одним из них.

Моя цель - преобразовать созданный компьютером текстовый файл, чтобы дать ему более понятный для человека свойства. С этой целью я хочу обработать все числа с десятичными цифрами более чем на десять: что-то вроде: 2. Это должно быть независимо от ключевых слов вокруг них.

Пример файла журнала:

[General]
Date=2016-01-20
Timestamp=2016-01-20T12:30:00

[Dewpoint]
Low=-17.7041803458378
LTime=14:55
High=-13.1057525836829
HTime=13:42

[Solar]
SunshineHours=4.78333333333332
SunshineHoursToMidnight=0.750000000000001

Желаемый результат:

[General]
Date=2016-01-20
Timestamp=2016-01-20T12:30:00

[Dewpoint]
Low=-17.70
LTime=14:55
High=-13.11
HTime=13:42

[Solar]
SunshineHours=4.78
SunshineHoursToMidnight=0.75

Округление не является необходимостью здесь, то есть усечение было бы достаточно для моих нужд.

Как я мог достичь этого без RTWFM? [!d5 ]

1
задан 21 January 2016 в 05:07

2 ответа

Возможно, что-то вроде этого:

perl -pe 's/(?<==)[-+]?[0-9]*\.?[0-9]+(!:)/sprintf("%.2f",$&)/e' log

, который перепечатывает с точностью 2 любое число с плавающей запятой, которое следует за = и не предшествует : (чтобы игнорировать поля времени ).

Если вы не хотите рассматривать целочисленные значения как плавающие точки, то несколько проще исключить поля времени, а следующее должно сделать это:

perl -pe 's/[-+]?[0-9]*\.[0-9]+/sprintf("%.2f",$&)/e' log

Регулярное выражение с плавающей запятой берется из сопоставления чисел с плавающей точкой с регулярным выражением

1
ответ дан 23 May 2018 в 14:08
  • 1
    Интересно, если десятичная точка должна быть факультативной. Интересно, должен ли a=42 стать a=42.00. ОП должен будет решить. – glenn jackman 21 January 2016 в 05:30
  • 2
    @glennjackman спасибо, да на самом деле я сочла это (особенно, поскольку это упрощает исключение полей времени), но решил сохранить определение «с плавающей запятой», как можно более каноническим. Я редактирую это как вариант. – steeldriver 21 January 2016 в 05:34

Прохождение через небольшое регулярное выражение должно работать

sed -r 's/([0-9]+\.[0-9]{2})[0-9]*/\1/' your_file

Чтобы быстро объяснить, что он ищет:

А цифра А еще 2 цифры Любое количество цифр

И все это заменяет только первые три.

Эта команда просто выведет изменения. Добавьте туда -i, если вы хотите, чтобы он редактировал файл напрямую. Если это не файл, вы можете перенаправить и перенаправить вещи на sed:

$ sed -r 's/([0-9]\.[0-9]{2})[0-9]*/\1/' <<EOF
> [General]
> Date=2016-01-20
> Timestamp=2016-01-20T12:30:00
> 
> [Dewpoint]
> Low=-17.7041803458378
> LTime=14:55
> High=-13.1057525836829
> HTime=13:42
> 
> [Solar]
> SunshineHours=4.78333333333332
> SunshineHoursToMidnight=0.750000000000001
> EOF
[General]
Date=2016-01-20
Timestamp=2016-01-20T12:30:00

[Dewpoint]
Low=-17.70
LTime=14:55
High=-13.10
HTime=13:42

[Solar]
SunshineHours=4.78
SunshineHoursToMidnight=0.75
1
ответ дан 23 May 2018 в 14:08
  • 1
    Спасибо, но я бы хотел, чтобы он был более общим (оставьте ссылку на высокие, низкие или другие ключевые слова). Обновит вопрос. – Tfb9 21 January 2016 в 04:42
  • 2
    @ Tfb9 Обновлено ... – Oli♦ 21 January 2016 в 13:52

Другие вопросы по тегам:

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