Bash - 逐行排列的数字

时间:2017-01-30 22:57:50

标签: bash file loops

所以我有一个看起来如下的文件:

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

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

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

将整个文件中的第一列放在"首先"中。我将如何通过并对每一行进行求和,而不是按列? (我已经知道如何使用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

提前致谢,我们非常感激。

4 个答案:

答案 0 :(得分:2)

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

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

并养成引用变量的习惯,除非你特别需要结果进行分词和整合。

答案 1 :(得分:1)

如果你在数组中读取一行,只需对数组的最后三个元素求和:

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

输出:

232
157

答案 2 :(得分:1)

@Eric:试试:

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

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

答案 3 :(得分:0)

你也可以使用awk:

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