【问题标题】:Error in code ... need correction代码错误...需要更正
【发布时间】: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 行出错。

提前感谢您的宝贵时间。

【问题讨论】:

    标签: bash shell


    【解决方案1】:

    如果任务只使用awk

    如果字段用空格分隔:

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

    否则,使用FS 变量,如:

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

    【讨论】:

    • awk 的力量。用简单的一行代码替换 8-10 行代码是多么容易。 +1
    【解决方案2】:

    这不是您在 bash 中进行算术运算的方式。要将两个变量 xy 的值相加并将结果存储在第三个变量 z 中,它应该如下所示:

    z=$((x + y))
    

    但是,您可以更简单地在 awk 中执行所有操作,将您的 awk '{print $4}' 替换为:

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

    awk 方法也能正确处理浮点数,而 bash 方法则不能。

    【讨论】:

    • +1 关于处理 FP 号码的建议。我们也可以使用z=$[x + y] 或使用let 或使用expr 进行bash 算术。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      只需一行即可完成:

      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

      【讨论】:

      • 虽然你的答案是正确的并且代码示例很好,但我不建议将新用户链接到 ABS。它包含许多不良做法。
      猜你喜欢
      • 2013-03-08
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-14
      • 2011-04-17
      相关资源
      最近更新 更多