【发布时间】:2012-01-16 15:56:25
【问题描述】:
我正在提取文件第四列中的值并尝试添加它们。
#!/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
第 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
第 6 行出错。
提前感谢您的宝贵时间。
【问题讨论】:
如果任务只使用awk:
如果字段用空格分隔:
awk '{ sum += $4 } END { print sum }' tag_FLI1
否则,使用FS 变量,如:
awk 'BEGIN { FS = "|" } { sum += $4 } END { print sum }' tag_FLI1
【讨论】:
awk 的力量。用简单的一行代码替换 8-10 行代码是多么容易。 +1
这不是您在 bash 中进行算术运算的方式。要将两个变量 x 和 y 的值相加并将结果存储在第三个变量 z 中,它应该如下所示:
z=$((x + y))
但是,您可以更简单地在 awk 中执行所有操作,将您的 awk '{print $4}' 替换为:
awk '{ sum += $4 } END { print sum }'
awk 方法也能正确处理浮点数,而 bash 方法则不能。
【讨论】:
z=$[x + y] 或使用let 或使用expr 进行bash 算术。
您需要使用数字上下文来添加数字。此外,这里不需要 cat ,因为 awk 可以从文件中读取。除非您在另一个脚本中使用“标签”,否则您不需要创建文件。此外,如果您使用的是 bash 而不是 perl 或 php,则变量赋值的左侧不应有“$”。
t=0
while read -r i
do
t=$((t + i))
done < <(awk '{print $4}' tag_FLI1)
echo "$t"
【讨论】:
只需一行即可完成:
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 个问题:
VAR=... 分配的,而不是$VAR=...。见http://tldp.org/LDP/abs/html/varassignment.html
【讨论】: