在bash中添加两个变量

时间:2015-03-03 00:01:53

标签: bash shell awk

我有一个包含以下内容的文件:

  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:指定的数字对此命令无效。

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

4 个答案:

答案 0 :(得分:2)

shell用于对工具的调用进行排序,这就是全部。如果您只是进行文本处理,那么在awk中完成整个工作:

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

答案 1 :(得分: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来指定数字的基数,这样您就不会被无效的八进制数字绊倒,例如&#34; 0089&#34; < / p>

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

假设您有理由想要获得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在评论中指出,GNU awk将尝试将以零开头的数字解释为八进制,如果它们是程序常量而不是输入,则回退到十进制。考虑:

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

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