我有一个包含以下内容的文件:
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:指定的数字对此命令无效。
你能给我另一个解决方案吗?
答案 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
(不是合法的八进制数)被视为十进制。