Я пытаюсь выполнить некоторую арифметику с плавающей запятой в bash и получаю следующие ошибки в терминале:
$
(standard_in) 2: parse error
(standard_in) 2: parse error
(standard_in) 1: parse error
Код, который выдает эти ошибки:
qlen=$(awk '{print $2 ; exit}' $filepath/result)
slen=$(awk '{print $3 ; exit}' $filepath/result)
len=$(awk 'BEGIN{max = 0} {if (($4) > max) max = ($4)} END {print max}' $filepath/result)
qcov=$(echo $len / $qlen | bc -l) #parse error 2
scov=$(echo $len / $slen | bc -l) #parse error 2
if (( $(echo "$qcov >= .7" | bc -l) )) && (( $(echo "$scov >= .7" | bc -l) )) #parse error 1???
then
score=$(awk '{ total += $1; count++ } END { if (count > 0) {printf "%f", total/count} }' $filepath/result) #parse error 1???
else
score=0
fi
Я нахожу максимальное число в столбце $4
и делю его на числа в столбце $2
и $3
.Я хочу, чтобы результат с плавающей запятой, а не целочисленная арифметика.Я сохраняю это число с плавающей запятой в qcov
и scov
и использую условный оператор в операторе if.Я думаю, что я сузил точные линии, где происходят эти ошибки разбора, которые прокомментированы выше.Все они вытекают из команды bc
.
Входной файл $filepath/result
выглядит следующим образом:
34.234 234 756 34 3 34
76.542 234 756 7 64 76
63.357 234 756 97 5 35
Этот файл можно увидеть как таблицу с разделителями пробелами.Столбцы $2
и $3
всегда являются одним и тем же числом, поэтому оператор awk, присваивающий qlen
и slen
, должен вести себя так, как ожидается с оператором exit
.
Мое лучшее предположение заключается в том, чтоЭто некоторая проблема, когда выражение if оценивается как true, но я не совсем понимаю, что происходит дальше.
Заранее спасибо.
РЕДАКТИРОВАТЬ:
Спасибо всемкто помог, я понял, почему я получил эти ошибки.Файл result
создается каждый раз, когда я вызываю этот набор кода.Были случаи, когда программа, которая ее создавала, ничего не печатала, что приводило к EOF (?) В начале и вызывало ошибки разбора, которые я получил.Я вполне уверен, что именно поэтому я получил ошибки разбора.