如何对文本文件中的一行数字求和-- Bash Shell 脚本

How to sum a row of numbers from text file-- Bash Shell Scripting

我正在尝试编写一个 bash 脚本来按行和列计算数字的平均值。我正在阅读的文本文件示例是:

1 2 3 4 5
4 6 7 8 0

行数和列数未知。目前,我只是想用一个 while 循环对每一行求和。期望的输出是:

1 2 3 4 5 Sum = 15
4 6 7 8 0 Sum = 25

每一行依此类推。目前这是我的代码:

while read i
do
  echo "num: $i"
  (( sum=$sum+$i ))
  echo "sum: $sum"
done < 

调用程序是 stats -r test_file。 “-r”表示行——我还没有开始列。我当前的代码实际上只是获取每列的第一个数字并将它们加在一起,然后其余数字作为语法错误出错。它说错误来自 16,这是 (( sum=$sum+$i )) 行,但老实说我无法弄清楚问题是什么。我应该告诉你,我对 bash 脚本编写非常陌生,我用谷歌搜索并在高处和低处搜索了这个问题的答案,但找不到。任何帮助是极大的赞赏。

您正在逐行读取文件,求和行不是算术运算。试试这个:

while read i
do
  sum=0
  for num in $i
  do
    sum=$(($sum + $num))
  done
  echo "$i Sum: $sum"
done < 

只需使用 for 循环从每一行拆分每个数字。希望对您有所帮助。

另一种方式(不是纯粹的bash):

while read line
do
    sum=$(sed 's/[ ]\+/+/g' <<< "$line" | bc -q)
    echo "$line Sum = $sum"
done < filename

另一种非 bash 方式(反对:OP 要求 bash,赞成:不依赖于 bashisms,使用浮点数)。

awk '{c=0;for(i=1;i<=NF;++i){c+=$i};print [=10=], "Sum:", c}'

使用 numsum -r util 覆盖行添加,但输出格式需要一点胶水,通过低效的 paste-ing 一些实用程序:

paste "" \
      <(yes "Sum =" | head -$(wc -l < "") ) \
      <(numsum -r "") 

输出:

1 2 3 4 5   Sum =   15
4 6 7 8 0   Sum =   25

注意 -- 对于给定文件 foo 上的 运行 行,首先像这样初始化 </code>:</p> <pre><code>set -- "" foo paste "" <(yes "Sum =" | head -$(wc -l < "") ) <(numsum -r "")