【问题标题】:add two variables in bash在bash中添加两个变量
【发布时间】:2015-05-03 12:12:09
【问题描述】:

我有一个文件A,其中包含:

  0012,001650,0089

我想得到第 1 列和第 2 列的总和以及第 3 列和第 60 列的商。使用 awk 我试过了

  col1=`awk -F, '{print $1}' $fileA | sed 's/0*//'`
  col2=`awk -F, '{print $2}' $fileA | sed 's/0*//'`
  col3=`awk -F, '{print $3}' $fileA | sed 's/0*//'`

  sum=$((col1 + col2))
  qou=$((col3 / 60))

但是我收到了这个错误:

apn_processing.sh[226]: col1 + col2: 指定的数字对该命令无效。

你能给我另一个解决方案吗?

【问题讨论】:

  • 不要使用旧的和不推荐使用的反引号,使用这样的括号:col1=$(awk -F, '{print $1}' $fileA | sed 's/0*//')

标签: bash shell awk


【解决方案1】:

shell 用于对工具的调用进行排序,仅此而已。如果您只是在做文本处理,那么在 awk 中完成整个工作:

$ awk -F, '{
  sum = $1 + $2
  quo = $3 / 60
  print sum, quo
}' "$fileA"
1662 1.48333

【讨论】:

  • 如果我只需要整数(四舍五入)作为输出呢?
  • @newbie:那你就可以用适当格式的awk的printf函数了; printf "%d %d\n", sum, quo 将截断小数部分。
【解决方案2】:

您不需要调用 awk 3 次来提取字段:

$ IFS=, read -r a b c < file
$ echo $a
0012
$ echo $b
001650
$ echo $c
0089
$ echo $((10#$a + 10#$b))
1662
$ echo $((10#$c / 60))
1
$ bc  <<< "scale=3; $c/60"
1.483

在 bash 数学中,您可以使用符号 base#number 指定数字的基数,这样您就不会被“0089”之类的无效八进制数字绊倒

【讨论】:

    【解决方案3】:

    特别是因为您正在处理浮点运算,我建议您在 awk 中执行计算:

    sum=$(awk -F, '{print $1+$2}' file)
    qou=$(awk -F, '{print $3/60}' file)
    

    【讨论】:

      【解决方案4】:

      假设您有理由希望将答案放入 shell 变量中:

      $ read sum quo < <(awk -F, '{print ($1+$2), $3/60}' "$fileA")
      $ echo $sum $quo
      1662 1.48333
      

      bash 不同,awk 在其作为输入接收的数字的前导零上没有问题。例如,观察以下内容就可以正常工作:

      $ echo 016 08 | awk '{print $1, $2, $1+$2, $1/$2}'
      016 08 24 2
      

      一边

      mklement0 在 cmets 中指出 GNU awk 将尝试将以零开头的数字解释为八进制,如果它们是程序常量而不是输入,则返回十进制。考虑:

      $ awk 'BEGIN{a=016;b=08; print a, b, a+b, a/b}'
      14 8 22 1.75
      

      在上面,016 被视为八进制。相比之下,08 不是合法的八进制数,被视为十进制。

      【讨论】:

      • 干得好;顺便说一句:GNU awk 有点模棱两可确实将八进制识别为文字在脚本中(不是通过输入),然后回退到 十进制解释;尝试gawk 'BEGIN {print 010}'gawk 'BEGIN {print 08}'
      • @mklement0 有趣!我将其添加到答案中。
      猜你喜欢
      • 2018-07-11
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      • 2021-03-31
      • 1970-01-01
      • 2022-12-07
      • 2018-05-17
      • 2017-03-01
      相关资源
      最近更新 更多