【问题标题】:Bash floating point arithmetic with bc giving blank result?bash浮点运算与bc给出空白结果?
【发布时间】:2017-10-15 15:53:02
【问题描述】:

我正在尝试使用 grep 计算文本文件中某个单词的出现次数,然后使用 bc 将该结果(整数)与小数相乘。但是,结果只是一个空白值(我猜是空字符串?)。

我计算文件中单词出现次数的方式是:

result=$(grep -i -o "$word" $file | wc -l)

然后我尝试通过(value 是小数)对该结果进行浮点数学运算:

sum="value * ( $result )" | bc

但是在终端中,我只得到空白/空行作为结果,没有值或任何东西。我做错了什么?

【问题讨论】:

  • 除非value 可以是非整数,否则这里不需要bcwc -l 只会输出整数。
  • @chepner value 可以是非整数,这就是我尝试使用bc 的原因,因为我相信 bash 本身只能进行整数运算
  • 正确;我只是想明确这一点,因为一个答案建议用算术表达式代替bc
  • 在主要问题中更清楚地说明了这一点,谢谢!

标签: bash bc


【解决方案1】:

这是一个简单的语法问题。但首先:你知道 grep 的 -c 吗?如

grep -i -c  -o pattern file

这将为您节省 wc

你用管道输出

sum="value * ( $result )"

通过公元前。那不会产生输出。你可能想要

sum=$(echo "183276 * $result" | bc)

echo $sum

【讨论】:

  • grep -co 仅在一行中多次出现相同模式时计为 1。
  • 是的;结果与grep -o | wc -l 相同
  • 我的意思是它不是 ;) 尝试 grep -oc 'x' <<< $'xx\nx'(结果:2)与 grep -o 'x' <<< $'xx\nx' | wc -l(结果:3)。
  • 附注:原始代码并未尝试通过管道输出sum="value * ( $result )",但它被解释为仅用于该命令的环境变量。
  • 我没有得到最后一个。如果我创建一个以echo $* > iets 为内容的shell 脚本mkietssum="value * ( $result ) " | ./mkiets 将创建iets 文件。所以来自sum="value * ( $result ) " 的标准输出被用作 bc 的输入。
【解决方案2】:

你可以只使用 Bash 来做到这一点

#!/bin/bash
result=$(grep -io "$word" "$file" | wc -l)
sum=$((value*result))
echo -e "$word founded $result times.\n$result * $value = $sum"

输出

darby@Debian:~$ word='toyota'
darby@Debian:~$ file="$HOME/Scrivania/file"
darby@Debian:~$ value=7
darby@Debian:~$ result=$(grep -io "$word" "$file" | wc -l)
darby@Debian:~$ sum=$((value*result))
darby@Debian:~$ echo -e "$word founded $result times.\n$result * $value = $sum"
toyota founded 2 times.
2 * 7 = 14
darby@Debian:~$

或使用 bc 的单行解决方案

darby@Debian:~$ echo "$value * $(grep -io "$word" "$file" | wc -l)" | bc
14
darby@Debian:~$

【讨论】:

  • echo $(command)command 一样,你不需要像这样嵌套你的单行。
猜你喜欢
  • 2013-01-31
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 2016-04-30
相关资源
最近更新 更多