在bash中添加两个变量
我有一个文件a,其中包含:在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))
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在评论中指出,GNUawk
将尝试将以零开头的数字解释为八进制,如果它们是程序常量而不是输入,则返回到十进制。考虑:
$ 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