2012-01-16 76 views
-4

我正在提取文件第四列中的值并尝试添加它们。第6行错误代码...需要更正

#!/bin/bash 
cat tag_FLI1 | awk '{print $4}'>tags 
$t=0 
for i in `cat tags` 
    do 
     $t=$t+$i (this is the position of trouble) 
    done 
echo $t 

错误预先感谢您的宝贵时间。

回答

3

在仅使用awk的任务的情况下:

如果字段是用空格分开:

awk '{ sum += $4 } END { print sum }' tag_FLI1 

否则,使用FS变量,如:

awk 'BEGIN { FS = "|" } { sum += $4 } END { print sum }' tag_FLI1 
+0

'awk'的功能。 8-10行代码可以用简单的一行代替。 +1 – 2012-01-16 17:38:25

3

这不是如何你在bash中进行算术运算。从两个变量xy添加值,并将结果存储在第三个变量z,它应该是这样的:

z=$((x + y)) 

但是,你可以更简单地只是尽一切AWK,免去您awk '{print $4}'有:

awk '{ sum += $4 } END { print sum }' 

awk方法也将正确地处理浮点数,而bash方法不会。

+0

+1关于处理FP编号的建议。我们还可以使用'z = $ [x + y]'或者使用'let'或者使用'expr'来进行bash算法。 – 2012-01-16 17:27:46

1

,可以在短短的一行来完成:

awk '{sum += $4} END {print sum}' tag_FLI1 

但是,如果这是一个学习锻炼的bash,看看这个例子:

#!/bin/bash 
sum=0 
while read line; do 
    ((sum += $line)) 
done < <(awk '{print $4}' tag_FLI1) 
echo $sum 

有本质上3个问题与您的代码:

  1. 变量分配使用VAR=...而不是$VAR=...。请参阅http://tldp.org/LDP/abs/html/varassignment.html
  2. 总结数字的方式不正确。有关如何操作的示例,请参阅arithmetic expansion
  3. 没有必要使用中间文件来迭代命令的输出。如上所示使用while循环,但要注意this caveat
+0

尽管您的回答正确并且代码示例很好,但我不建议将新用户链接到ABS。它包含了很多不好的做法。 – jordanm 2012-01-16 16:23:48

1

您需要使用数字上下文来添加数字。而且,这里不需要cat,因为awk可以从文件中读取。除非您在其他脚本中使用“标签”,否则不需要创建该文件。另外,如果您使用的是bash而不是perl或php,则在变量赋值的左侧不应该有“$”。

t=0 
while read -r i 
do 
    t=$((t + i)) 
done < <(awk '{print $4}' tag_FLI1) 
echo "$t"