在bash中添加两个变量

在bash中添加两个变量,bash,shell,awk,Bash,Shell,Awk,我有一个文件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))

我有一个文件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\u processing.sh[226]:col1+col2:指定的数字对此命令无效。


您能为我提供另一种解决方案吗?

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

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

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

$ read sum quo < <(awk -F, '{print ($1+$2), $3/60}' "$fileA")
$ echo $sum $quo
1662 1.48333
在一边 mklement0在评论中指出,GNU
awk
将尝试将以零开头的数字解释为八进制,如果它们是程序常量而不是输入,则返回到十进制。考虑:

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

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

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

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

您无需调用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
$IFS=,读取-r a b c$bc如果输出只需要整数(四舍五入)如何?@newbie:那么您可以使用awk的
printf
函数并使用适当的格式
printf“%d%d\n”,sum,quo
将截断小数部分。做得很好;另一方面:GNU awk在某种程度上模糊地将八进制识别为脚本中的文字(而不是通过输入),并返回到十进制解释;试试看
gawk'BEGIN{print 010}
vs.
gawk'BEGIN{print 08}
@mklement0有趣!我在答案中添加了这一点。不要使用旧的和不推荐使用的back tics,请使用以下括号:
col1=$(awk-F,{print$1}'$fileA | sed's/0*/')
$ 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