使用bc命令进行标准解析错误

时间:2019-06-24 02:18:11

标签: bash macos awk scripting bc

我正在尝试在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列中的数字。我想要浮点结果,而不是整数算术。我将此浮点数保存到qcovscov中,并在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始终是相同的数字,因此,分配qlenslen的awk语句应与exit语句一样工作。

我的最佳猜测是,如果if语句评估为true时会出现一些问题,但是我不十分了解发生了什么问题。

谢谢。

编辑:
感谢所有提供帮助的人,我弄清楚了为什么会出现这些错误。每次我调用此代码集时都会创建文件result。在某些情况下,创建它的程序不会打印任何内容,从而导致EOF(?)开头并导致我得到解析错误。我]非常确定这就是为什么我会解析错误。

2 个答案:

答案 0 :(得分:2)

不确定拥有awk的全部功能时为什么要进行如此多的shell操作。

找到第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

我不知道接下来要做什么,但是您也应该能够轻松地添加到该脚本中。

答案 1 :(得分:0)

@Justin:您的文件result有几行。因此,qlenslen是一个嵌入了多个数字的字符串。使用-x运行脚本时,您可以立即看到此问题。