【问题标题】:Arithmetic operations using numbers from grep使用 grep 中的数字进行算术运算
【发布时间】:2021-11-18 13:33:55
【问题描述】:

我有FILE,我可以使用grep从中提取两个数字。数字出现在最后一列。

 $ grep number FILE 
 number1:    123
 number2:    456

我想将数字分配给变量,例如$num1$num2,并使用变量做一些算术运算。

如何使用 bash 命令执行此操作?

【问题讨论】:

  • 输出正好是“ number1: 123 number2: 456 ”?
  • @Alireza 数字因输入而异。它们可以是花车。但是输出的形式总是一样的。
  • “number1:”是输出的一部分吗?
  • @Alireza 是的。那就是我使用的 bash 命令和命令的终端输出。我grep“数字”。然后当然包括“数字”的行被grepped。
  • 总是正好是 2 个数字吗?或者条目的数量会有所不同?

标签: bash awk grep


【解决方案1】:

假设:

  • 我们希望匹配字符串number开头的行
  • 我们总是会从输入文件中找到 2 个匹配 ^number 的匹配项
  • 对在数组中存储值不感兴趣

样本数据:

$ cat file.dat
number1: 123
not a number: abc
number: 456

我们将使用awk 找到所需的值并将所有值打印到单行输出:

$ awk '/^number/ { printf "%s ",$2 }' file.dat
123 456

从这里我们可以使用read 来加载变量:

$ read -r num1 num2 < <(awk '/^number/ { printf "%s ",$2 }' file.dat)

$ typeset -p num1 num2
declare -- num1="123"
declare -- num2="456"

$ echo ".${num1}.${num2}."
.123.456.

注意:句点作为视觉分隔符添加

【讨论】:

    【解决方案2】:

    首先,您需要从文件中提取数字。假设文件始终采用规定的格式,那么您可以使用 while 循环,结合read 命令将数字读入命名变量,一次一行。

    然后,您可以使用 $(( )) 运算符执行整数运算,以保持传入数字的总和。

    例如:

    #!/bin/bash
    
    declare -i total=0           # -i declares an integer.
    
    while read discard number; do # read returns false at EOF. discard is ignored.
      total=$((total+number))     # Variables don't need '$' prefix in this case.
    done < FILE                   # while loop passes STDIN to the 'read' command.
    
    echo "Total is: ${total}"
    

    【讨论】:

    • 请阅读why-is-using-a-shell-loop-to-process-text-considered-bad-practice 了解一些不这样做的原因。
    • 当然。如果您想要性能、稳健性或该文章中描述的许多其他属性,那么 Bash 不是您的答案。但是,OP 明确要求提供 Bash 解决方案。
    • 非常常见的是,当 OP 询问 bash 命令时,他们当然不仅仅意味着 bash 内置命令,他们只需要可以从 bash 调用的命令,例如标签中包含的 awk。跨度>
    • 也许你是对的。也许不是。只有 OP 可以确认这一点。在可能的情况下,我更倾向于使用内置而不是子进程,尤其是在不影响可读性的情况下。
    • 这很好,但是当它需要一个 shell 读取循环时,因为在这种情况下,结果将非常缓慢、脆弱、复杂、不可移植等。考虑一下你发布的内容与 awk '{total+=$2} END{print total+0}' FILE 显然更简洁,运行速度会快几个数量级,并且可以在每个 Unix 机器上的每个 shell 中按原样工作。只是需要考虑的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多