Арифметическое выражение Bash с переменной

Я пишу небольшой скрипт bash для обработки моих данных.

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

Однако написанный мной скрипт не работает.

Терминал выдает следующую ошибку

")0.192500rror: недопустимый арифметический оператор (токен ошибки "

значение каждой переменной: inc= 0,0200000, str= -0,192500, pts= 1024,

Мой сценарий выглядит следующим образом:

for i in *.TXT; do

    inc=$(sed -n '/^#XPERCHAN/ p' $i | sed 's/[A-Z:# ]//g')
    str=$(sed -n '/^#OFFSET/ p' $i | sed 's/[A-Z:# ]//g')
    pts=$(sed -n '/^#NPOINTS/ p' $i | sed 's/[A-Z:# .]//g')
    lst=$(( ($pts-1)*$inc+$str))
    echo $lst

done

Пожалуйста, помогите мне здесь. Спасибо!


person Bemtevi77    schedule 05.08.2015    source источник


Ответы (1)


bash знает только целые числа. Используйте bc или более высокий язык программирования для поплавков.

lst=$(echo "($pts - 1) * $inc + $str" | bc)

EDIT: Если ваш файл отформатирован так, как я думаю (#XPERCHAN: 0.0200000), вы можете сделать все это одним awk:

lst=$(awk '/^#XPERCHAN/ { inc=$2 } /^#OFFSET/ { str=$2 } /^#NPOINTS/ { pts=$2 } END { print ((pts + 1) * inc + str) }' $i)
person Amadan    schedule 05.08.2015
comment
Я использовал ваш код, он возвращает мне следующее: (standard_in) 1: недопустимый символ: ^M (standard_in) 1: недопустимый символ: ^M (standard_in) 1: недопустимый символ: ^M - person Bemtevi77; 05.08.2015
comment
Это означает, что ваш файл создан в Windows, и ваш sed недостаточно хорошо его очистил. Либо добавьте \r к списку символов для фильтрации, либо используйте метод awk (который изначально его не подберет). - person Amadan; 05.08.2015
comment
Я использовал ваш EDIT, он работает отлично! Спасибо! Я все еще хотел бы знать, почему первый способ дал мне эту ошибку. - person Bemtevi77; 05.08.2015
comment
Спасибо еще раз! Я понял! - person Bemtevi77; 05.08.2015
comment
Как я уже сказал, Windows. В Windows (и MSDOS) строка заканчивается на \r\n (CR LF, ^M^J, множество способов написать это). В Linux строка заканчивается на \n (LF, ^J), а \r (^M) — это просто еще один символ. Поэтому, когда вы удаляете все A-Z:# и пробелы из него, ^M все еще там, в конце; и bc это не нравится. - person Amadan; 05.08.2015