【问题标题】:Bash - Sum numbers in line, line by lineBash - 逐行求和
【发布时间】:2017-01-30 22:57:50
【问题描述】:

所以我有一个如下所示的文件:

9032894 First Last 89 43 100 
9423897 First Last 89 20 48 

以此类推,以这种格式继续。我希望得到最后三个数字的总和,(例如第一行的 89 43 100),然后使用 echo 显示这个总和。在我尝试这样做时,我只是将整个第一列存储在一个变量中,如下代码所示:

first=$(echo $INT | cut -d" " -f4 $1)

将获取文件中的整个第一列并将其存储在“first”中。我将如何遍历并总结每一行,而不是按列? (我已经知道如何使用 awk 来做到这一点,我正在尝试使用 bash 进行另一种编码方式)?到目前为止,我的完整代码(甚至还没有接近工作)是:

#!/bin/bash

filename=$1

while read -a rows
do
    first=$(echo $INT | cut -d" " -f4 $1)
    second=$(echo $INT | cut -d" " -f5 $1)
    third=$(echo $INT | cut -d" " -f6 $1)
    echo ${first}
    echo ${second}
    echo ${third}       
done< $filename

提前致谢,非常感谢。

【问题讨论】:

  • 什么是$INT
  • 您说要计算总和。我在脚本中没有看到任何添加。
  • 为什么不while read id firstname lastname first second third 将每一列放入不同的变量中?
  • 你永远不会对你正在读入的 rows 数组做任何事情。

标签: bash file loops


【解决方案1】:

您可以将文件列直接读入变量:

while read id firstname lastname first second third
    echo "${first}"
    echo "${second}"
    echo "${third}"   
    echo Sum: $(( first + second + third ))  
done< "$filename"

并养成引用变量的习惯,除非您特别需要将结果进行分词和通配。

【讨论】:

    【解决方案2】:

    @Eric:试试看:

    awk '{print $NF+$(NF-1)+$(NF-2)}'  Input_file
    

    正如你提到的最后 3 个字段,我们总是需要求和,所以我们不需要经过一个循环,我们可以简单地通过执行 ($NF+$(NF-1)+$(NF-2) ) 其中 $NF 表示一行的最后一个字段,$(NF-1) 是倒数第二个字段,依此类推。

    【讨论】:

      【解决方案3】:

      如果将一行读入数组,只需将数组的最后三个元素相加即可:

      while read -a cells ; do
          echo $(( cells[-1] + cells[-2] + cells[-3] ))
      done
      

      输出:

      232
      157
      

      【讨论】:

        【解决方案4】:

        你也可以使用 awk:

        $ awk '{s=0; for(i=4;i<=NF;i++) s+=$i; print s}' file
        232
        157
        

        【讨论】:

        • 感谢您提供了很好的解决方案(如果我们要添加的字段超过最后 3 个字段,将始终有帮助/工作),我认为我们可以避免此处的循环和变量(因为 OP 只要求最后三个要总结的字段),我也添加了我的解决方案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-05
        • 1970-01-01
        • 2018-08-13
        • 2012-02-23
        • 1970-01-01
        • 2017-05-22
        • 1970-01-01
        相关资源
        最近更新 更多