Стандартные ошибки разбора с помощью команды bc - PullRequest
0 голосов
/ 24 июня 2019

Я пытаюсь выполнить некоторую арифметику с плавающей запятой в 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 (?) В начале и вызывало ошибки разбора, которые я получил.Я вполне уверен, что именно поэтому я получил ошибки разбора.

Ответы [ 2 ]

2 голосов
/ 24 июня 2019

не уверен, почему вы выполняете так много операций с оболочкой, когда у вас есть полная мощность awk.

найдите максимум столбца 4 и разделите на столбцы 2 и 3.

$  awk 'NR==FNR{if(max<$4) max=$4; next} {print max/$2, max/$3}' file{,}

0.41453 0.128307
0.41453 0.128307
0.41453 0.128307

Я не понимаю, что вы будете делать дальше, но вы также сможете легко добавить в этот скрипт.

0 голосов
/ 24 июня 2019

@ Джастин: Ваш файл result состоит из нескольких строк. Следовательно, qlen и slen - это строка с несколькими вложенными числами. Вы можете сразу увидеть эту проблему, когда запустите свой скрипт с -x.

...